【问题标题】:Spring Application Context - Main and Test FoldersSpring 应用程序上下文 - 主文件夹和测试文件夹
【发布时间】:2016-03-22 20:05:23
【问题描述】:

我有一个包含 4 个典型源文件夹的 Spring 项目 - main/srcmain/resourcestest/srctest/resources。当我运行我的应用程序时,Spring 获取main/resources 中的应用程序上下文文件,如果我运行任何Junit 测试,它会获取test/resources 下的application-context.xml 文件。 Spring 如何正确获取application-context.xml 文件或是否涉及任何配置?

【问题讨论】:

    标签: java spring junit applicationcontext


    【解决方案1】:

    尝试使用jsfStruts 运行任何其他项目,它们还将从各自的文件夹中选择资源。跟春天没有关系。它将由 maven 或您正在使用的任何其他构建系统来处理。

    main/src , main/resources , test/src , test/resources 
    

    这些文件夹是您创建 maven 或 gradle 项目时的标准文件夹。

    【讨论】:

    • 我没有运行 maven 构建,而是从 eclipse 运行 junit。 Maven 在幕后处理这个问题吗?这是一个已经存在的应用程序,因此想在创建新项目时检查是否需要进行任何配置来实现此行为。
    • @PunterVicky 当您运行 junit 时,您的 junit 库将始终在测试文件夹中查找资源,因为当您以 Run as-> Junit 运行测试时,您的 ide 将使用类路径中的 junit运行您的测试。 Junit 将从测试文件夹中挑选资源
    • @Punter:这并没有解决测试如何在 src/test/resources 和 src/main/resources 下的上下文 xml 之间进行选择的问题。显然测试还是需要src/main下的东西。
    【解决方案2】:

    应用程序告诉 Spring 应用程序上下文在哪里。 Web 应用程序通过在 web.xml 中配置 ContextLoaderListener 来执行此操作。 对于每个测试如何加载应用程序上下文是测试配置的一部分,@ContextConfiguration 注释指定上下文如何从什么位置或从什么注释类加载。

    例如,如果我设置要使用的测试

    @ContextConfiguration(loader = AnnotationConfigContextLoader.class,
    classes = MyTest.ContextConfiguration.class)
    public class MyTest {
        @Autowired MyStuff stuff;
    
        static class ContextConfiguration {
            @Bean public MyStuff getMyStuff() {
                return new MyStuff();
            }
        }
    }
    

    然后 MyTest 使用测试中的注释来决定注入什么,并使用指定的 ContextConfiguration 填充这些字段。它完全无视类路径中的任何 xml 配置。

    上下文加载器还可以指定从中加载上下文的位置,请参阅org.springframework.test.context.ContextLoader 的文档。

    你没有说你使用的是什么版本的 Spring。在 3.0 之前的测试通过实现类 org.springframework.test.AbstractSpringContextTests 的抽象方法 loadContext 来管理测试上下文,这是弹簧感知测试扩展的层次结构的一部分。

    【讨论】:

    • 我认为这是关于 junit 如何选择合适的资源,即当您将资源放在测试资源文件夹和 src 资源文件夹中时。是的,我们将指定配置文件的类路径,但它如何从测试而不是源中找到它
    • 还可以尝试在没有弹簧框架的情况下使用任何独立的 maven 项目。并在测试资源和 src 资源中包含一些资源,在您的 cp 中包含 junit 并编写一个使用此资源的测试类并运行测试以查看 junit 正在选择哪个资源
    • @Pragnini:具体问题是测试如何选择使用哪个应用程序上下文。 spring 不会让它取决于 maven 或 IDE 给出的类路径上的任何内容。
    • 我想如果我清楚地理解他提到他有两个配置文件,一个在 src 文件夹中,一个在 test 文件夹中(同名),因为他已经运行测试意味着他的测试乍得可能已经指定上面@ContextConfiguration 中的上下文配置位置和位置属性,所以我提供了答案,junit 如何从测试文件夹中选择资源
    【解决方案3】:

    我知道这个问题很老,但在 Spring-boot 2.x 中,文件夹结构不同。 这是我从 Spring 初始化程序和 IntelliJ 中得到的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多