5

文字列を返すいくつかのパラメーターを持つメソッドがあります。多くの場合、メソッドは例外をスローします。返されるとき、文字列の内容は、パラメーターと、コンピューターに接続されている特定の USB ドングルの構成の両方に依存します。ただし、返される文字列の長さは、パラメーターに完全に依存します。

私が疑問に思っているのは、Mockito (私は初めてです) を使用してこれを単体テストする方法です。返された文字列が特定の長さである場合、テスト メソッドの 1 つが正常に完了する必要があります。

さらに情報が必要な場合はお知らせください。

4

3 に答える 3

10

そのようなインターフェースを持つ:

interface Foo {
    void method(String s);
}

1 つのアイデアは、正規表現マッチングを使用することです。

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's Answerはまったく問題ありません。さらに、検証コードに匿名クラスを挿入する代わりに、意図を説明するメソッドを使用しました。彼の答えに+1:)

しかし、 FESTAssertライブラリを使用した代替手段があり、これを使用するArgumentCaptorと、記述しなくても流暢な方法で、より多くの単純なアサーションを提供できます。主張が多いと、ハムクレストがなんだか不安になります。だからここに私がほとんどの時間を使っているものがあります:

@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 に答える