0

シナリオは、ドメイン オブジェクトを検証し、検証メッセージを別のオブジェクトに保存しようとしています。クラスはValidator次のとおりで、メソッドは次のようになります。

public void validate (Domain domain, ValidationInfo info)

ValidationInfoオブジェクトには次のものがあります。

List<String> messages = new ArrayList<String> messages ()

Validatorクラスはサービス クラスから呼び出されます。ドメイン オブジェクトの検証が失敗した場合は、エラー メッセージがValidationInfoクラスのリストに格納されます。

テスト ケースの 1 つのサービス テスト クラスで、検証の失敗をテストするために次のように記述しました。

@Test
public void testvalidation () throws Exception { 
    Domain domain = createDomainWithInvalidData();
    service.create (domain);
    verify(mockValidator).validate(domain, validationInfo);
    assertFalse (validationInfo.getMessages().isEmpty());

今私が欲しいのは、validationInfoオブジェクトから失敗メッセージを取得して、それに基づいていくつかのアサートを作成できるようにすることです。しかし、それは機能していません。

誰でもこれに光を当てることができますか?

4

2 に答える 2

0

何時間も頭を悩ませた後、私は自分が望んでいたことを達成することができました.

私たちがする必要があるのはdoAnswer、mockito の使用です。スニペットの下を見つけてください:

doAnswer(new Answer<ValidationInfo> () {
  @Override
  public ValidationInfo answer (InvocationOnMock invocationOnMock) throws Throwable {
     Object [] args = invocationOnMock.getArguments();
     ValidationInfo vi = (ValidationInfo) args [1];
     vi.getMessages.add("some message");
     return vi;
}}).when(validator).validate (domain, validationInfo);

このようにして、カスタムの失敗メッセージをリストに追加して、サービスで検証を失敗させることができました。それがテストの全体的な目的でした。

以前は、サービス コードでリストのサイズをチェックしていたため、テストに合格していませんでした。verifyまた、メソッドが呼び出されるかどうかを確認するだけで、オブジェクトの状態を実際に変更しないため、リストサイズは常にゼロでした。

お役に立てれば。これを達成するためのより良い方法があれば、コメントしてください。

于 2012-09-19T13:28:10.280 に答える
0

私が収集したものから、あなたはユニットテストを行っていserviceます.

実際には、スタブ ( ) を作成しない限り、定義上何もしないMockito モックvalidationInfoのメソッドにメッセージが渡されるため、メッセージを取得しても意味がありません。コード サンプルの最後のアサーションでさえ、validationInfo は のデフォルトのモック動作によって変更されないため、必要ありません。given(...).willReturn(...)validate

Mockito はverify(...)、サービスとValidator.

に書き込まれたメッセージのテストはValidationInfo、のスコープとは関係ありません。service

ただし、必要なのValidatorは、検証メッセージの特定のテストを記述する必要がある の単体テストです。ValidationInfoAPIの一部を想像した次のスニペットを見てください。

public class ValidatorTest {

    Validator validator = new Validator(); // not a mock

    @Test
    public void when_<some_part_of_the_domain>_is_incorrect_report_validation_error() throws Exception { 
        // given
        Domain domain = createDomainWithInvalidData();

        // when
        validator.validate(domain, validationInfo);

        // then
        assertThat(validationInfo.getMessages()).isNotEmpty()); // not really necessary
        assertThat(validationInfo.getLastMessage().text()).contains("<some_part_of_the_domain> is wrong");
    }
}

テストを作成するために、 BDDキーワード (given、when、then) を使用したことに注意してください。また、優れたアサーション ツールを提供する FestAssert ライブラリを使用しました。

それは役立ちます。

于 2012-09-19T10:57:00.730 に答える