在整个上下文中运行其他测试时未注入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 (将#修改为@)