简体   繁体   English

在Spring Integration中模拟MessageHandler时出现java.lang.NoSuchMethodError

[英]java.lang.NoSuchMethodError while mocking MessageHandler in Spring Integration

I have a simple Spring Integration configuration that works 我有一个简单的Spring Integration配置

@Configuration
public class FTPIntegration {


@Bean
public MessageChannel outputIntegrationChannel(ErrorHandler errorHandler) {
    return MessageChannels
            .publishSubscribe()
            .errorHandler(errorHandler)
            .get();
}

@Bean
public IntegrationFlow ftpIntegration(ErrorHandler errorHandler, MessageHandler messageHandler) {
    return IntegrationFlows
            .from(outputIntegrationChannel(errorHandler))
            .transform(Transformers.toJson())
            .handle(messageHandler)
            .get();
}
}

I want to prepare some integration tests using Mockito to mock, spy MessageHandler and ErrorHandler. 我想使用Mockito准备一些集成测试来模拟,间谍MessageHandler和ErrorHandler。 So that's why I want to replace them in test configuration. 这就是我想在测试配置中替换它们的原因。

@Profile("test")
@EnableIntegration
@Configuration
@Import(value = FTPIntegration.class)
public class TestConf {

@Bean
@Primary
public ErrorHandler errorHandler() {
    return mock(ErrorHandler.class);
}

@Bean
@Primary
public MessageHandler messageHandler() {
    return mock(MessageHandler.class);
}
}

And use it in my test class 并在我的测试类中使用它

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConf.class)
public class FTPIntegrationTest {

@Autowired
@Qualifier("outputIntegrationChannel")
private MessageChannel integrationChannel;
}

But with initialization I got an error that 但是初始化后我得到了一个错误

java.lang.NoSuchMethodError: org.mockito.MockingDetails.getMockCreationSettings()Lorg/mockito/mock/MockCreationSettings;

at org.springframework.boot.test.mock.mockito.MockReset.get(MockReset.java:107)
at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:84)
at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:70)
at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.beforeTestMethod(ResetMocksTestExecutionListener.java:57)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:291)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
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.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Is it a fault of my configuration or there is no possibility to use Mockito's components in Spring Integration? 这是我配置的错误还是没有可能在Spring Integration中使用Mockito的组件?

When I use some simple method reference like returning log::error or log::info in MessageError and MessageHandler it works properly . 当我使用一些简单的方法引用,如在MessageErrorMessageHandler中返回log :: errorlog :: info时,它可以正常工作

I also tried to use MockIntegration.mockMessageHandler(); 我也试过使用MockIntegration.mockMessageHandler(); but result is the same (exception) because it use Mockito's mock underneath. 但结果是相同的(例外),因为它使用了Mockito的模拟。

Mockito was in 1.x version which was incompatible with Spring Integration with 5.x version. Mockito是1.x版本,与Spring Integration with 5.x版本不兼容。 Upgrading Mockito into 2.x (2.22.0) fixed this issue and works with Spring Integration (5.0.8.RELEASE). 将Mockito升级到2.x(2.22.0)修复了此问题,并与Spring Integration(5.0.8.RELEASE)一起使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM