【问题标题】:How to make JUnit test fall down if constuctor is present?如果存在构造函数,如何使 JUnit 测试失败?
【发布时间】:2015-09-01 02:20:06
【问题描述】:

我正在学习 JUnit 和测试驱动开发实践。我有空的 Money 接口:

public interface Money {

}

实现 Money 接口的 CommonMoney 类:

public class CommonMoney implements Money {

    private CommonMoney() {

    }

    public static Money create(String decimalPart, Currency currency) {
        return new Money() {
        };
    }
}

还有用于测试 CommonMoney 的 MoneyTest 类

public class MoneyTest {

    // some test cases before

    @Test
    public void shouldNotCreateCommonMoneyObjectWithEmptyConstructor() {
        @SuppressWarnings("unused")
        Money money = new CommonMoney();
        fail();
    }
}

现在测试用例 shouldNotCreateCommonMoneyObjectWithEmptyConstructor 是红色的,但如果 CommonMoney 的构造函数是私有的,它应该是绿色的,如果是公共的,它应该是红色的。是否可以制作这样的测试用例?我该怎么做?

【问题讨论】:

  • 如果构造函数是私有的,你的测试类不会编译。
  • 您可以使用反射,但为什么?您不信任与您合作的人吗?另请注意,随着系统的发展,实施测试变得脆弱且难以维护。
  • 如果你只是想保证私有构造函数永远不会被调用(无论出于何种原因),在构造函数的主体中抛出一个检查异常。但是,正如 agad 已经说过的那样,由于类外部的构造函数不可见,您的测试甚至无法编译。

标签: java junit tdd


【解决方案1】:

是否可以制作这样的测试用例?

是的,可以使用java反射来实现这个测试,例如see this question。否则,您无法从该类外部测试私有构造函数是否存在 - 代码将无法编译。

但是,测试它并没有真正的意义。访问修饰符确实是为了方便开发人员并限制访问范围。可以说,范围限制也是为了方便。

您的测试应涵盖公共 API,而不是查看私有实现。

【讨论】:

    【解决方案2】:

    这不是你需要测试的东西。

    正如 Agad 指出的那样,代码无论如何都不会按原样编译,因为通过将构造函数设为私有,您就无法使用空构造函数创建对象。

    编译器正在有效地为您进行检查,因此您无需编写特定的测试来检查它。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2015-09-03
      • 2019-07-19
      • 2013-05-24
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多