Java 如何在JMockit中对不可模拟的类型使用验证?
在JMockit中,有一些类型是完全不可模拟的(比如java.lang.Class),或者是非常糟糕的模拟方法(比如java.lang.Math,如中所述) 如何对这些类型使用验证?以链接问题为例,我如何验证调用的Java 如何在JMockit中对不可模拟的类型使用验证?,java,jmockit,Java,Jmockit,在JMockit中,有一些类型是完全不可模拟的(比如java.lang.Class),或者是非常糟糕的模拟方法(比如java.lang.Math,如中所述) 如何对这些类型使用验证?以链接问题为例,我如何验证调用的Math.pow()参数是否正确 举个例子,即使我调用了Math.pow(),这个测试还是通过了,但是我在验证中检查了Math.min(),我怎么能让它失败呢 public class TestTest { public static class MyClass {
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);
}};
}
}
将注释掉的行添加到mockMath
,只会导致灾难性的结果,因为会弄脏依赖于java.lang.Math
的类加载器等。将其设置为@Injectable
而不是@mock
没有效果,因为所有方法都是静态的
那么我如何验证它呢?示例测试毫无意义,因为方法
foo
总是返回常量值8
。它是如何得到这个结果的是一个无关的实现细节,而mock并不是用来检查实现细节的。很难想象有任何合法的测试需要检查像Math.pow
这样的方法是否被调用。所以,对于这样一个问题,IMO,最好的答案是:在这种情况下,你不会“使用验证”。所以,在类上使用验证时,没有办法不模仿它?在您看来,不需要验证这些低级类吗?嗯,我得再考虑一下。我自己也没有经历过任何问题;更重要的是相关的问题让我想到了这个问题,所以。。。正如我所说的,我必须再考虑一下。我同意@Rogerio的观点。我建议测试更高级别的行为。但是,如果您坚持要验证是否发生了求幂运算,则始终可以使用另一个间接级别:使用您自己的类包装Math
函数并模拟您的类。毕竟,使用Math
满足数学需求是一个实现细节。