5

コンシューマー機能インターフェイスでコールバックとして実行されるコードを単体テストしようとしています。

@Component
class SomeClass {

  @Autowired
  private SomeInteface toBeMockedDependency;

  public method() {
     toBeMockedDependency.doSomething(message -> {
        // Logic under test goes here 
        //             (implements java.util.function.Consumer interface)
        ...
     });
  }
}

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
  @InjectMocks
  private SomeClass someClass;
  @Mock
  private SomeInteface toBeMockedDependency;

  @Test
  public void testMethod() {
    ...
    someClass.method();
    ...
  }
}

基本的に、「toBeMockedDependency」を介して、テスト済みのコードにテスト済みの「メッセージ」を提供したいと考えています。

「toBeMockedDependency」をモックして、事前定義されたメッセージを提供するにはどうすればよいですか?
それは正しいアプローチですか?

4

1 に答える 1

8

toBeMockedDependency機能インターフェースを自動的に呼び出そうとしないでください。代わりに、 a を使用して匿名機能インターフェイス@Captorキャプチャし、テストを使用して手動で呼び出します。

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {
  @InjectMocks
  private SomeClass someClass;
  @Mock
  private SomeInteface toBeMockedDependency;
  @Captor
  private ArgumentCaptor<Consumer<Message>> messageConsumerCaptor;

  @Test
  public void testMethod() {
    someClass.method();
    verify(toBeMockedDependency).doSomething(messageConsumerCaptor.capture());
    Consumer<Message> messageConsumer = messageConsumerCaptor.getValue();

    // Now you have your message consumer, so you can test it all you want.
    messageConsumer.accept(new Message(...));
    assertEquals(...);
  }
}
于 2016-08-18T17:46:03.647 に答える