我有一个@KafkaListener
方法,可能会抛出一个IllegalArgumentException
。为了这个问题,它可能看起来像:
@KafkaListener(topics = "SomeTopic")
public void listen(ConsumerRecord<String, SomeDto> record) {
throw new IllegalArgumentException("Whats up?");
}
作为集成测试的一部分(使用Spring Boot和JUnit),我想测试该方法并断言确实引发了异常。在我的测试课中,我有一个测试可以归结为:
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
@Test
public void createHierarchy_invalidEventType_exception() {
exceptionRule.expect(IllegalArgumentException.class);
kafkaTemplate.send("SomeTopic", someDto);
}
日志显示:
org.springframework.kafka.listener.ListenerExecutionFailedException:侦听器方法'public void com.something.EventService.listenPosition(org.apache.kafka.clients.consumer.ConsumerRecord)'引发异常;嵌套的异常是java.lang.IllegalArgumentException:不支持此事件类型。
因此IllegalArgumentException
被包裹在ListenerExecutionFailedException
中,我修改了测试方法:
@Test
public void createHierarchy_invalidEventType_exception() {
exceptionRule.expectCause(isA(IllegalArgumentException.class));
kafkaTemplate.send("SomeTopic", someDto);
}
但是日志仍然显示相同的堆栈跟踪。我究竟做错了什么?如何验证@KafkaListener
方法确实引发了异常?
编辑: 这是测试的堆栈跟踪:
java.lang.AssertionError: Expected test to throw (an instance of org.springframework.kafka.listener.ListenerExecutionFailedException and exception with cause is an instance of java.lang.IllegalArgumentException)
at org.junit.Assert.fail(Assert.java:88)
at org.junit.rules.ExpectedException.failDueToMissingException(ExpectedException.java:263)
at org.junit.rules.ExpectedException.access$200(ExpectedException.java:106)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:245)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
谢谢。