在JMockit中,有些类型是完全不可模拟的(如java.lang.Class),或者是非常糟糕的模拟(如this question中所述的java.lang.Math)。
如何在这些类型上使用验证?以链接问题为例,我如何验证用正确的参数调用Math.pow()
?
举例来说,即使我拨打Math.pow()
,我也会通过此测试,但我会在验证中检查Math.min()
- 我怎么能让这次失败?
public class TestTest {
public static class MyClass {
public double foo() {
return Math.pow(2, 3);
}
}
@Tested MyClass mc;
// @Mocked java.lang.Math math;
@Test
public void testCalendar() throws Throwable {
double d = mc.foo();
assertThat(d, is(8.0));
new FullVerificationsInOrder() {{
Math.min(42.0, 17.0);
}};
}
}
将注释掉的行添加到模拟Math
中,只会导致依赖于java.lang.Math
的类加载器等造成灾难性后果。由于所有方法都是静态的,因此将@Injectable
代替@Mocked
无效。
那我怎么验证呢?