有一个带有多个参数的方法返回一个字符串。在许多情况下,该方法会引发异常。当它返回时,字符串的内容取决于参数和插入计算机的某个 USB 加密狗的配置。返回的字符串的长度完全取决于参数。
我想知道如何使用 Mockito(我是新手)对此进行单元测试。当返回的字符串具有一定长度时,其中一种测试方法应该成功完成。
如果您需要更多信息,请告诉我。
有这样的界面:
interface Foo {
void method(String s);
}
一种想法是使用正则表达式匹配:
final Foo mock = mock(Foo.class);
mock.method("abc");
verify(mock).method(matches(".{3}"));
不幸的是,没有内置的字符串长度匹配器(应该有!),但编写自定义匹配器很容易:
private static String hasSize(final int size) {
return argThat(new ArgumentMatcher<String>() {
@Override
public boolean matches(Object argument) {
return argument.toString().length() == size;
}
});
}
现在只需调用静态方法:
verify(mock).method(hasSize(4));
如果您想坚持使用 Hamcrest,Tomasz 的答案非常好。另外,他使用了一种描述意图的方法,而不是在您的验证码中插入匿名类。+1 他的回答:)
但是FESTAssert库有一个替代方案,ArgumentCaptor
它可以提供更多简单的断言,而无需编写一个,并且以流利的方式。当你有很多断言时,Hamcrest 会变得有点不安。所以这就是我大部分时间都在使用的东西:
@RunWith(MockitoJUnitRunner.class)
public class MyTypeTest {
@Mock MyType myType;
@Captor ArgumentCaptor<String> stringCaptor;
@Test public void ensure_method_receive_String_that_has_32_chars() {
// given
...
// when
...
// then
verify(myType).method(stringCaptor.capture());
assertThat(stringCaptor.getValue()).isNotNull().hasSize(32);
}
希望有帮助。
从 Java 8 开始,您可以使用以下单行代码检查长度:
verify(yourMock).theMethod(argThat(a -> a.toString().length() == LENGTH));
(使用import static org.mockito.ArgumentMatchers.argThat;
)