Mockito doAnswer()

问题描述 投票:0回答:1

抛出异常时,我能以某种方式使用doAnswer()

我在集成测试中使用它来获取方法调用,并且测试配置了@RabbitListenerTest ...

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyIT {

@Autowired
private RabbitTemplate rabbitTemplate;

@Autowired
private MyRabbitListener myRabbitListener;

@Autowired
private RabbitListenerTestHarness harness;

@Test
public void testListener() throws InterruptedException {
  MyRabbitListener myRabbitListener = this.harness.getSpy("event");
  assertNotNull(myRabbitListener);

  final String message = "Test Message";
  LatchCountDownAndCallRealMethodAnswer answer = new LatchCountDownAndCallRealMethodAnswer(1);
  doAnswer(answer).when(myRabbitListener).event(message);

  rabbitTemplate.convertAndSend("exchange", "key", message);

  assertTrue(answer.getLatch().await(20, TimeUnit.SECONDS));
  verify(myRabbitListener).messageReceiver(message);
}

@Configuration
@RabbitListenerTest
public static class Config {
  @Bean
  public MyRabbitListener myRabbitListener(){
    return new MyRabbitListener();
  }
 }
}

它可以正常工作,但是当我引入一个抛出异常时,它就不行了>]

此作品

@RabbitListener(id = "event", queues = "queue-name")
  public void event(String message) {
    log.info("received message > " + message);
}

此剂量

@RabbitListener(id = "event", queues = "queue-name")
  public void event(String message) {
    log.info("received message > " + message);
    throw new ImmediateAcknowledgeAmqpException("Invalid message, " + message);
}

有帮助的人

<<

LatchCountDownAndCallRealMethodAnswer是非常基本的
@Override public Void answer(InvocationOnMock invocation) throws Throwable { invocation.callRealMethod(); this.latch.countDown(); return null; }

您可以将其复制到一个新的类并将其更改为类似的内容

private volatile Exception exeption;

@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
    try {
        invocation.callRealMethod();
    } 
    catch (RuntimeException e) {
        this.exception = e;
        throw e;
    }
    this.latch.countDown();
    return null;
}

public Exception getException() {
    return this.exception;
}

然后

assertTrue(answer.getLatch().await(20, TimeUnit.SECONDS));
assertThat(answer.getException(), isInstanceOf(ImmediateAcknowledgeAmqpException.class));

请打开github问题;该框架应立即支持。

java spring mockito integration-testing spring-rabbitmq
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.