Java 如何在JMockit中对不可模拟的类型使用验证?

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 {

在JMockit中,有一些类型是完全不可模拟的(比如java.lang.Class),或者是非常糟糕的模拟方法(比如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);
        }};
    }
}
将注释掉的行添加到mock
Math
,只会导致灾难性的结果,因为会弄脏依赖于
java.lang.Math
的类加载器等。将其设置为
@Injectable
而不是
@mock
没有效果,因为所有方法都是静态的


那么我如何验证它呢?

示例测试毫无意义,因为方法
foo
总是返回常量值
8
。它是如何得到这个结果的是一个无关的实现细节,而mock并不是用来检查实现细节的。很难想象有任何合法的测试需要检查像
Math.pow
这样的方法是否被调用。所以,对于这样一个问题,IMO,最好的答案是:在这种情况下,你不会“使用验证”。所以,在类上使用验证时,没有办法不模仿它?在您看来,不需要验证这些低级类吗?嗯,我得再考虑一下。我自己也没有经历过任何问题;更重要的是相关的问题让我想到了这个问题,所以。。。正如我所说的,我必须再考虑一下。我同意@Rogerio的观点。我建议测试更高级别的行为。但是,如果您坚持要验证是否发生了求幂运算,则始终可以使用另一个间接级别:使用您自己的类包装
Math
函数并模拟您的类。毕竟,使用
Math
满足数学需求是一个实现细节。