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的匹配器,并保持简单和验证.
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给你的默认类型.
| 归档时间: |
|
| 查看次数: |
7322 次 |
| 最近记录: |