对于此类用例,您始终可以以编程方式启动上下文。请注意,在这种情况下,您负责上下文的生命周期。下面的伪代码说明了这一点:
@Test
public void yourTest() {
// setup your database
ConfigurableApplicationContext context =
new ClassPathXmlApplicationContext("/org/foo/your-context.xml");
// Or new AnnotationConfigApplicationContext(YourConfig.class)
try {
YourBean bean = context.getBean("beanId");
// Assertions
} finally {
context.close();
}
}
您可能需要 Spring 来初始化您的数据库。例如,您可以使用常规 Spring 测试上下文支持来仅初始化数据库设置所需的 bean,并以编程方式启动另一个上下文来断言您的服务。如果该上下文需要一些用于数据库初始化的服务,您可以启动一个子上下文,例如
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration // for instance FooTest-context.xml
public class FooTest {
@Autowired
private ApplicationContext mainContext;
@Test
public void yourTest() {
// setup your database
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext();
context.setParent(mainContext);
context.setConfigLocation("/org/foo/your-context.xml");
context.refresh();
try {
YourBean bean = context.getBean("beanId");
// Assertions
} finally {
context.close();
}
}
}
如果这成为一个经常出现的用例,您可以创建一个模板方法来启动容器并调用回调接口。这样您就可以在一个中心位置共享上下文生命周期管理。