我是JMockit的新手并为一个非常复杂的类编写测试,称之为XYZ。在每个@Test方法中,我想调用XYZ的相应实际方法,但是模拟所有(或有时几乎所有)其他方法,这些方法应该在之后进行验证。目前我的第一个测试方法看起来像这样(我想要模拟所有方法,除了"开始",所以我使用正则表达式):
@Test
public void testStart(@Mocked({ "^(start).*" }) XYZ xyz) {
new Expectations() {{
xyz.isValidState(); result = true;
}};
...
}
当我运行测试时,我得到" java.lang.IllegalStateException:此时缺少对模拟类型的调用;请确保只有在声明合适的模拟字段或参数后才会出现此类调用。 (在第一个期望被定义的行),似乎说嘲弄不起作用。我的正则表达式错了还是有另一个问题?
答案 0 :(得分:3)
该正则表达式选择将模拟的方法。因此,isValidState()
不会被模拟,因为它与表达式不匹配;因此,JMockit说,在结果"结果"使用字段。
除了使用new Expectations(XYZ.class)
部分模拟然后记录对所有应该使用的方法的期望之外,没有办法不模拟类中的单个方法而模拟所有其他方法被嘲笑。当然,这将是麻烦的。这在这里是件好事,因为一般的部分嘲笑不是用于"普通"例;它仅适用于特殊情况。
如果你想对一个类进行单元测试,即使是一个复杂的类,也应该将mocking限制在它的依赖项中,即使那时你只选择或需要考虑的那些依赖项作为被测单元的外部。也就是说,如果XYZ
中给定的内部调用方法妨碍了干净测试,那么您可以异常选择"模拟它"通过部分嘲笑;但这通常意味着要在每个测试中模拟类XYZ
中的单个方法(或只是少数几个)。