mockito 如何在调用另一个模拟对象的方法时调用另一个模拟对象的方法?

wljmcqd8  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(151)

下面给出的是我的项目结构

class A{
    void methodA(){
        // Gets data from the DB
        // Processes the data
        // Sends the data via a kafka topic MyTopic
        kafka.send(topicName, data);
    }
}

class B{
    // methodB is listening to topic MyTopic
    void methodB(String data){

    }
}

我想测试整个流程。使用Mockito,当在methodA中触发kafka.send时,是否有办法直接调用methodB(绕过kafka)?

6yt4nkrj

6yt4nkrj1#

我不确定我是否理解你所嘲笑的,但我的方法会是这样的:

@InjectMocks
private ClassA classA;

@Mock 
Kafka kafka

private String data = "someData";
private String topicName = "someTopicName";

@Test
void yourTestMethod() {
  B objectOfClassB = new B();

  when(kafka.send(any(), any()).thenAnswer(a -> {
    CustomObject data = (CustomObject) a.getArguments()[1]; // get the Data object 
    objectOfClassB.MethodB(data);
    return;
  });

  classA.methodA();

  Assertions.assertThat(objectOfClassB.getSomeAssertionValue()).isEqualTo(1);
}

ObjectB显然可以是一个服务间谍或其他东西。它不一定要用“new”来示例化。任何给定的Object引用都可以。

相关问题