有一个方法有几个返回String的参数。在许多情况下,该方法抛出异常。当它返回时,String的内容取决于插入计算机的某个USB加密狗的参数和配置。返回的String的长度完全取决于参数。
我想知道的是如何使用Mockito(我是新手)进行单元测试。当返回的String具有一定长度时,其中一个测试方法应该成功完成。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:9)
有这样的界面:
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));
答案 1 :(得分: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);
}
希望有所帮助。
答案 2 :(得分:0)
从 Java 8 开始,您可以使用此单行检查长度:
verify(yourMock).theMethod(argThat(a -> a.toString().length() == LENGTH));
(使用 import static org.mockito.ArgumentMatchers.argThat;
)