在使用整个上下文运行其他测试时,Springboot @MockBean 没有被注入

问题描述 投票:0回答:1

当尝试在 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();
    }

}

结果我得到mockito说 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>

谢谢你

java spring-boot mocking integration-testing spring-context
1个回答
0
投票

我遇到了这个问题。就我而言,我添加了

@ContextConfiguration(classes = {SagaListener.class}) // Inject the MockBean in this class

SagaListenerIT

© www.soinside.com 2019 - 2024. All rights reserved.