Mockito - 验证双精度值

2022-09-02 20:03:47

我有一个名为formula1的方法,它采用一个双精度,该双精度在myManager上调用,我正在传递到这个65.888 * 60中。当我尝试验证这一点时,我遇到了浮点问题。验证失败。它期望3953.28,但3953.280029296875

verify(myManager, times(1)).method1(65.888 * 60d);

无论如何,我可以使此验证对浮点检查进行模糊检查。就像你对 assertEquals 所做的那样,你在末尾输入一个 delta。

谢谢


答案 1

您可以捕获该值,例如

final ArgumentCaptor<Double> captor = ArgumentCaptor.forClass(Double.class)
...
verify(myManager).method1(captor.capture());

然后断言:

assertEquals(expected, captor.getValue(), delta)

或者,也许,使用一个参数匹配器来做断言:

verify(myManager).method1(doubleThat(new ArgumentMatcher<Double>() 
{
    @Override 
    public boolean matches(final Object actual)
    {
        return Math.abs(expected - (Double) actual) <= delta;
    }
}));

更新:

您可以使用AdduralMatchers.eq(double,double)代替使用上述任何一种方法,例如:

verify(myManager).method1(AdditionalMatchers.eq(expected, delta));

虽然根据文档明智地使用AdditonalMatchers匹配器:

另外,Matchers提供了很少使用的匹配器,只是为了与EasyMock有一定的兼容性而保留。非常明智地使用其他匹配器,因为它们可能会影响测试的可读性。建议使用 Matchers 中的匹配器,并保持存根和验证的简单性。


答案 2

有一个Hamcrest匹配器非常适合这一点。

org.hamcrest.Matchers.closeTo(value, error)

所以你可以写一些类似的东西

verify(myManager).method1(doubleThat(org.hamcrest.Matchers.closeTo(65.888 * 60, 0.001)));

顺便说一句,您永远不需要在Mockito中编写,因为这是Mockito为您提供的默认类型。times(1)verifyverify


推荐