我在Spring Framework上运行了几个集成测试,它们扩展了名为BaseitCase的基类。
,如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppCacheConfiguration.class, TestConfiguration.class}, loader = SpringBootContextLoader.class)
@Transactional
@WebMvcTest
public abstract class BaseITCase{...}
...
public class UserControllerTest extends BaseITCase {...}
问题是其中一个测试有几个声明:@mockbean,在执行这个测试的那一刻,Spring会重新创建上下文,随后的测试有时会使用错误的bean(来自为使用@mockbean的测试创建的上下文)。我通过检查bean有不同的hashcode就知道了这一点。
当我使用@EventListener时,它变得非常关键。因为调用了错误上下文(已经完成执行的测试类的上下文)的监听器,并且那里有错误的bean。
原因是具有@MockBean的测试的spring配置与其他测试不同,因此spring框架无法缓存以前使用的上下文,需要重新加载它。您可以在这里找到更详细的解释:https://github.com/spring-projects/spring-boot/issues/10015
正如您所说,如果将模拟bean移动到父类,上下文不会重新加载,这是有意义的,因为bean配置保持不变。
一个可能的解决方案是将模拟bean定义为一个简单的模拟,并在需要的地方手动注入它。
public class UserControllerTest extends BaseITCase {
private Foo foo = Mockito.mock(Foo.class);
@Autowired
private UserController userController;
@Before
public void setUp() {
super.setup();
this.userController.setFoo(foo);
}
}
@Component
public class UserController {
private Foo foo;
@Autowired
public void setFoo(final Foo foo) {
this.foo = foo;
}
}
问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri
问题内容: 我需要在测试类的单个方法中更改applicationContext中活动的Spring概要文件,并且由于我使用的是ProfileResolver,因此在刷新竞赛之前,我需要运行一行代码。我尝试了以下方法: 但是我得到: DirtiesContext对我不起作用,因为它是在类/方法执行之后而不是之前运行的,并且无论如何我都需要在运行刷新/重新加载之前执行一行代码。 有什么建议?我试图查看
我得到的错误是: 我试图更改上下文配置的位置,如下所示:
我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean
问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这
假设我想为类编写一个,它可以是,因此我需要加载。 我的测试有注释和main方法 当然,我有这样一些基准: 现在的问题是如何注入? 可能的解决办法