在测试中使用@MockBean强制重新加载Application Context

时间:2017-08-09 09:49:49

标签: java spring mockito spring-test springmockito

我在Spring Framework上运行了几个集成测试,扩展了名为 BaseITCase 的基类。
像这样:

php --info | grep timezone

问题是其中一个测试有几个声明: 在它内部的@MockBean和执行此测试的那一刻,Spring重新创建了上下文,并且在此之后的测试有时会使用错误的bean(从使用@MockBean完全为测试创建的上下文中)。我通过检查bean有不同的哈希码来发现这一点。

当我使用@EventListener时,它变得非常重要。因为调用了错误上下文(已经完成执行的测试类的上下文)的侦听器,并且我在那里有错误的bean。

有没有解决办法?

我尝试将所有@MockBean声明移动到基本类,并且它工作正常,因为没有创建新的上下文。但是,它使基础课太重了。 此外,我尝试为此测试创建一个脏上下文,但接下来的测试失败,并显示上下文已被关闭的消息。

1 个答案:

答案 0 :(得分:0)

@MockBean 可能会导致上下文重新加载 as explained in the previous answer

作为替代方案,如果您使用的是 Spring Boot 2.2+,则可以使用 @MockInBean 而不是 @MockBean。它可以保持您的上下文干净,并且不需要重新加载您的上下文。

@SpringBootTest
public class UserControllerTest extends BaseITCase {

    @MockInBean(UserController.class)
    private Foo foo;

    @Autowired
    private UserController userController;

    @Test
    public void test() {
        userController.doSomething();
        Mockito.verify(foo).hasDoneSomething();
    }
}

@Component
public class UserController {

    @Autowired
    private Foo foo;

}

免责声明:我创建这个库是为了这个确切的目的:在 spring bean 中模拟 bean 并避免冗长的上下文重新创建。