Mockito doAnswer()
Mockito doAnswer()
抛出异常时,我能以某种方式使用 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;
}
您可以将其复制到新的 class 并将其更改为
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问题;该框架应该支持这种开箱即用的功能。
抛出异常时,我能以某种方式使用 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;
}
您可以将其复制到新的 class 并将其更改为
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问题;该框架应该支持这种开箱即用的功能。