【问题标题】:How to test constructor with this() invocation?如何使用 this() 调用测试构造函数?
【发布时间】:2014-07-07 19:09:39
【问题描述】:

这是我的课。我需要测试这个参数化的构造函数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() 调用而苦苦挣扎。如有任何建议,我将不胜感激。

更新:

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

【问题讨论】:

  • 检查value是否为100。
  • 是的,但在这种情况下,我正在检查另一个构造函数。
  • 我对您正在努力解决的问题感到困惑。请更具体
  • 具体想测试什么?
  • 我需要检查 this() 调用。

标签: java unit-testing mocking


【解决方案1】:

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

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

在这种情况下,您需要问自己,当使用 String param 构造函数实例化类 A 时会发生什么不同,这就是您需要在测试中检查的内容。在您的示例中,value 未在任何地方使用,但在此示例来自的实际代码中,它可能对您可以检查以验证(间接)this() 的类的行为有一些影响叫。如果不是,则要么是多余的,要么您需要重构以使您的类更具可测试性。

【讨论】:

    【解决方案2】:

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

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

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

    this.superParam.concat(additionalParam);
    

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

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

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

    private String superParam;
    

    private String superParam = "";
    

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

    【讨论】:

    • 您修复了NullPointerException,但表达式仍然无效。它创建一个连接的字符串并丢弃它,因为它没有分配给任何东西。 字符串在 Java 中是不可变的。(我知道你知道这一点。)
    • @DavidConrad 值得注意。已编辑。我还添加了StringBuilder 的替代品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多