Mockito - 验证双倍值

RNJ*_*RNJ 15 java unit-testing mockito

我有一个名为method1的方法,它接受一个在myManager上调用的double我传入这个65.888*60.当我尝试验证这个时,我得到了浮点问题.验证失败.它预计3953.28但3953.280029296875

verify(myManager, times(1)).method1(65.888 * 60d);
Run Code Online (Sandbox Code Playgroud)

无论如何我可以使这个验证对浮点检查进行模糊检查.就像你在assertEquals中做的那样,你在最后输入一个delta.

谢谢

Jon*_*han 26

你可以捕获这个值,例如

final ArgumentCaptor<Double> captor = ArgumentCaptor.forClass(Double.class)
...
verify(myManager).method1(captor.capture());
Run Code Online (Sandbox Code Playgroud)

断言:

assertEquals(expected, captor.getValue(), delta)
Run Code Online (Sandbox Code Playgroud)

或者,或许,使用参数匹配器来执行断言:

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

更新:

而不是使用上述任何一种方法,您可以使用AdditionalMatchers.eq(double, double),例如:

verify(myManager).method1(AdditionalMatchers.eq(expected, delta));
Run Code Online (Sandbox Code Playgroud)

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

AdditionalMatchers提供很少使用的匹配器,仅与EasyMock保持一定的兼容性.非常明智地使用其他匹配器,因为它们可能会影响测试的可读性.建议使用Matchers的匹配器,并保持简单和验证.


Daw*_*ica 7

Hamcrest匹配器非常适合这种情况.

org.hamcrest.Matchers.closeTo(value, error)
Run Code Online (Sandbox Code Playgroud)

所以你可以写一些像

verify(myManager).method1(doubleThat(org.hamcrest.Matchers.closeTo(65.888 * 60, 0.001)));
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你不需要写times(1)Mockito verify,因为这是verifyMockito给你的默认类型.