У меня есть метод @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: метод слушателя 'publi c 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)
Спасибо.