断言Kafka侦听器方法中引发了特定异常

时间:2020-03-05 15:39:36

标签: java exception junit

我有一个@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)

谢谢。

0 个答案:

没有答案