如何解决在整个上下文中运行其他测试时未注入Springboot @MockBean
当尝试在Junit测试中注入带有注解@MockBean的bean时,我遇到了一些问题。 结果,我得到的是注入的真实服务,而不是模拟的服务,但是奇怪的行为是,只有在运行带有maven verify的测试(以及其他集成测试)时,才会发生这种情况。
基本上,我要模拟的bean被注入到侦听器(@Component)内,该侦听器由集成测试期间队列中发送的消息触发。当侦听器运行时,其中的服务才是真正的服务,而不是被模拟的服务。
在我看来,当运行其他测试时,实际的bean先前已注入到上下文中,并且@MockBean虽然应该重新启动spring上下文,但是当遇到bean时,并不会用模拟的bean替换现有的bean。相同的类型。
这确实是一个奇怪的行为,因为文档说“上下文中定义的任何现有的相同类型的单个bean都将被该模拟替换”。好吧,这没有发生。
下面您会找到一些片段,这些片段显示了如何完成此操作。
要嘲笑的服务是:
@Slf4j
@Service
@Transactional
public class SomeServiceImpl implements SomeService {
@Override
@Async
public void doStuff(){
...
}
}
像这样注入我服务的监听器
@Slf4j
@Component
@Transactional
public class SagaListener {
@Autowired
private SomeService someService;
@JmsListener(destination = "${mydestinationtopic}",containerFactory = "myFactory",subscription = "my-subscription",selector = "eventType =
'MY_EVENT'" )
public void receive(MyEventClass event) {
someService.doStuff();
}
}
这是我的测试班
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class SagaListenerIT {
@MockBean
private SomeService someService;
@Autowired
private Sender sender;
@Test
public void createNamespaceSuccess() throws InterruptedException {
...
sender.send(event,event.getEventType(),myTopic);
BDDMockito.then(someService).should().doStuff();
}
}
结果是,我得到了模仿,说someService进行了0次调用,这是因为真正的服务正在被调用。
@MockBean为什么不替换真正的bean?不应重新初始化上下文吗?
我尝试在其他测试中添加@DirtiesContext注释,在这种情况下,一切正常,但这不是一个干净的解决方案。
这是我pom的一部分,其中定义了故障安全插件。顺便说一句,这真的很简单:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
</executions>
</plugin>
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。