基于Consumer函数接口的单元测试回调

6

我正在尝试对在Consumer函数接口中作为回调函数运行的代码进行单元测试。

@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”向测试代码提供已测试的“message”。

如何模拟“toBeMockedDependency”以提供预定义的消息?
这是否是正确的方法?


message 是从哪里来的?它是 SomeClass 的字段,method() 的参数还是其他什么东西? - noscreenname
在生产代码中,依赖项会生成以下消息:toBeMockedDependency.doSomething(Consumer consumer) { ... String message = "... .."; consumer.accept(message); ... } - Boris
你能提供完整的代码,展示 consumer.accept(message) 何时何地被调用吗? - noscreenname
1个回答

8

不要试图让toBeMockedDependency自动调用您的函数接口。相反,使用@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(...);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接