基本上,如果您在不同的测试类中具有相同的应用程序上下文配置,那么 spring 足够聪明地为您配置它。例如,假设您有两个类 A 和 B,如下所示:
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class A {
@MockBean
private C c;
//Autowired fields, test cases etc...
}
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class B {
@MockBean
private D d;
//Autowired fields, test cases etc...
}
在此示例中,A 类模拟 bean C,而 B 类模拟 bean D。因此,spring 将它们视为两种不同的配置,因此将为 A 类加载应用程序上下文一次,为 B 类加载一次。
相反,如果我们想让 spring 在这两个类之间共享应用程序上下文,它们必须如下所示:
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class A {
@MockBean
private C c;
@MockBean
private D d;
//Autowired fields, test cases etc...
}
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class B {
@MockBean
private C c;
@MockBean
private D d;
//Autowired fields, test cases etc...
}
如果你像这样连接你的类,spring 将只为 A 类或 B 类加载一次应用程序上下文,这取决于这两个类中的哪个类在测试套件中首先运行。这可以在多个测试类中复制,唯一的标准是您不应该以不同的方式自定义测试类。任何导致测试类与其他类不同的定制(在 spring 的眼中)最终都会在 spring 创建另一个应用程序上下文。