2015-06-16 72 views
0

我正在学习JUnit和测试驱动开发实践。我有空货币接口:如果构造函数存在,如何使JUnit测试失败?

它实现货币接口

CommonMoney类:

public class CommonMoney implements Money { 

    private CommonMoney() { 

    } 

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

和测试CommonMoney

public class MoneyTest { 

    // some test cases before 

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

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

+4

如果构造函数是私有的,那么您的测试类不会编译。 – agad

+2

你可以使用反射,但**为什么?**你不相信你正在使用的人吗?另外请注意,随着系统的增长,实施测试很脆弱并且难以维护。 – kdgregory

+1

如果你只是想保证private构造函数永远不会被调用(因为什么原因)在构造函数的主体内抛出一个检查异常。但是,正如agad已经指出的那样,由于类之外的构造函数不可见,你的测试甚至不会编译。 –

回答

2

是否有可能做出这样的测试用例?

是的,可以通过使用java反射来实现此测试,例如see this question。否则,不能从该类的外部测试私有构造函数是否存在 - 代码将不会编译。

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

您的测试应该覆盖公共API并且不要看私有实现。

1

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

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

编译器正在为您做检查,所以您不需要编写特定的测试来检查它。