5

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

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

如果您需要更多信息,请告诉我。

4

3 回答 3

10

有这样的界面:

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));
于 2012-10-30T15:14:19.643 回答
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);
}

希望有帮助。

于 2012-10-30T16:53:48.793 回答
0

从 Java 8 开始,您可以使用以下单行代码检查长度:

verify(yourMock).theMethod(argThat(a -> a.toString().length() == LENGTH));

(使用import static org.mockito.ArgumentMatchers.argThat;

于 2021-02-02T06:38:04.300 回答