如何使用this()调用来测试构造函数?

时间:2014-07-07 19:09:39

标签: java unit-testing mocking

这是我的班级。我需要测试这个参数化构造函数A(String param)

public class A {
    private String superParam;
    private Integer value;

    public A(String param) {
        this();
        append(param);
    }

    public A() {
        this.value = 100; 
    }

    public void append(String additionalParam) {
        this.superParam.concat(additionalParam);
    }        
}

现在我正在努力进行this()调用。我会因任何建议而受到关注。

UPD:

我还想知道在没有创建对象时如何在构造函数调用期间模拟方法?

2 个答案:

答案 0 :(得分:0)

使用独立的main()方法测试,

public static void main(String[] args) {
  A a = new A("Hello");
  assert(a.value == 100);
}

我注意到你的代码在这里投了NullPointerException

this.superParam.concat(additionalParam);

而且,虽然与测试this()无关,但您应该分配该操作的结果(您必须明确地执行该操作,因为Java String是不可变的),

this.superParam = this.superParam.concat(additionalParam);

(您可能还将superParam更改为StringBuilder,将concat()更改为append())。无论如何你原来的版本 ,所以我会改变

private String superParam;

private String superParam = "";

由于断言未失败,并且由于a.value不是null,因此调用了this()构造函数。其他任何内容都不会在您的代码中设置a.value

答案 1 :(得分:0)

简短的回答是,除非您公开value(通过更改其访问修饰符或提供getter方法),否则您无法测试this()是否被调用。

但是,您不应该检查this()是否被调用。在给定特定输入的情况下,您的测试应通过观察其状态的变化或其在其他类上所做的更改来定义类的行为。

在这种情况下,您需要问自己,当A类使用String param构造函数进行实例化时,会发生什么变化,这是您在测试中需要检查的内容。在您的示例中,value并未在任何地方使用,但在此示例来自的实际代码中,它可能会对您可以检查以验证(间接)验证的类的行为产生一些影响this()被召唤了。如果它没有,它可能是多余的,或者您需要重构以使您的课程更易于测试。