gpt4 book ai didi

java - Mockito doAnswer()

转载 作者:行者123 更新时间:2023-12-02 09:13:03 26 4
gpt4 key购买 nike

当抛出异常时,我可以以某种方式使用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();
}
}
}

它工作正常,但是当我引入抛出Exception时,它不会,即

这有效

@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;
}
finally {
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 - Mockito doAnswer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com