使用Mockito测试返回的字符串是否具有一定的长度

时间:2012-10-30 15:06:31

标签: java string junit mocking mockito

有一个方法有几个返回String的参数。在许多情况下,该方法抛出异常。当它返回时,String的内容取决于插入计算机的某个USB加密狗的参数和配置。返回的String的长度完全取决于参数。

我想知道的是如何使用Mockito(我是新手)进行单元测试。当返回的String具有一定长度时,其中一个测试方法应该成功完成。

如果您需要更多信息,请与我们联系。

3 个答案:

答案 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;