XmlWebApplicationContext,AnnotationConfigWebApplicationContext和GenericWebApplicationContext有什么区别

时间:2019-07-06 12:59:59

标签: java spring testng spring-test

我正在使用TestNG和spring-test编写单元测试,该单元测试通过@ContextConfiguration加载xml上下文,并通过@WebAppConfiguration加载调度程序servlet。我有一个像blow这样的类,它获取上下文并打印上下文类型。

@Component
public class ApplicationContextInitializer implements ApplicationContextAware {


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextInitializer.applicationContext = applicationContext;
        if (applicationContext instanceof AnnotationConfigApplicationContext) {
            System.out.println("1");
        }

        if (applicationContext instanceof GenericWebApplicationContext) {
            System.out.println("3");
        }

        if (applicationContext instanceof GenericXmlApplicationContext) {
            System.out.println("4");
        }

        if (applicationContext instanceof ResourceAdapterApplicationContext) {
            System.out.println("5");
        }

        if (applicationContext instanceof StaticApplicationContext) {
            System.out.println("6");
        }

        if (applicationContext instanceof XmlWebApplicationContext) {
            System.out.println("7");
        }

        if (applicationContext instanceof AnnotationConfigWebApplicationContext) {
            System.out.println("8");
        }
    }
}

测试类:

@ContextConfiguration(value = "classpath:integration-context-test.xml")
@TestPropertySource(locations = {"classpath:temp.properties"})
@WebAppConfiguration
public class TaskTest extends AbstractTransactionalTestNGSpringContextTests {}

为什么控制台显示"3"并显示GenericWebApplicationContext?什么时候会返回提到的其他两种类型?使用TestNG时是否可以通过书面XmlWebApplicationContext类获得ApplicationContextInitializer

1 个答案:

答案 0 :(得分:0)

  

为什么控制台显示"3"并显示为GenericWebApplicationContext

在使用 Spring TestContext Framework 的集成测试中,如果用ApplicationContext注释测试类,则GenericWebApplicationContext@WebAppConfiguration。否则,它将是GenericApplicationContext

集成测试的ApplicationContextContextLoader加载。在您的示例中,具体实现为GenericXmlWebContextLoader。这是因为您为XML配置文件指定了locations

  

何时会返回提到的其他两种类型?

在集成测试中,它不会返回您提到的其他类型,因为 Spring TestContext Framework 中的所有ContextLoader实现都会创建GenericApplicationContext或{ {1}}。

  

使用TestNG时是否可以通过书面GenericWebApplicationContext类获得XmlWebApplicationContext

不,不在测试中。

但是您通常不需要依赖它为ApplicationContextInitializer。知道它是XmlWebApplicationContext(因此是ConfigurableWebApplicationContext)通常在生产代码和测试中就足够了。