弹簧 jUnit 测试属性文件

2022-09-01 09:24:44

我有一个jUnit Test,它有自己的属性文件(application-test.properties)和它的spring config文件(application-core-test.xml)。

其中一种方法使用由弹簧配置实例化的对象,即弹簧组件。类中的一个成员从 application.properties 派生其值,这是我们的主属性文件。通过 jUnit 访问此值时,它始终为 null。我甚至尝试将属性文件更改为指向实际属性文件,但这似乎不起作用。

以下是我访问属性文件对象的方式

@Component
@PropertySource("classpath:application.properties")
public abstract class A {

    @Value("${test.value}")
    public String value;

    public A(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    public A(String text) {
        this();
        // do something with text and value.. here is where I run into NPE
    }

}

public class B extends A { 
     //addtnl code

    private B() {

    }


    private B(String text) {
         super(text)
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml",
                             "classpath:META-INF/spring/application-schedule-test.xml"})
@PropertySource("classpath:application-test.properties")
public class TestD {

    @Value("${value.works}")
    public String valueWorks;

    @Test
    public void testBlah() {     
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        B b= new B("blah");
        //...addtnl code

    }    
}      

答案 1

首先,@PropertySource中的 application.properties 应该读取该文件的名称(匹配这些内容很重要):application-test.properties

@PropertySource("classpath:application-test.properties ")

该文件应位于类路径下(在根目录下)。/src/test/resources

我不明白为什么你会指定一个依赖关系硬编码到一个名为.该组件是否仅用于测试环境?application-test.properties

通常的做法是在不同的类路径上具有具有相同名称的属性文件。加载一个或另一个取决于是否正在运行测试。

在通常布局的应用程序中,您将拥有:

src/test/resources/application.properties

src/main/resources/application.properties

然后像这样注入它:

@PropertySource("classpath:application.properties")

更好的办法是在 spring 上下文中将该属性文件公开为 Bean,然后将该 Bean 注入到任何需要它的组件中。这样,您的代码就不会散落对 application.properties 的引用,并且您可以使用任何您想要的内容作为属性源。这里有一个例子:如何在spring项目中读取属性文件?


答案 2

至于测试,你应该使用Spring 4.1,它将覆盖其他地方定义的属性:

@TestPropertySource("classpath:application-test.properties")

测试属性源的优先级高于从操作系统环境或 Java 系统属性加载的属性源,以及应用程序添加的属性源,如 @PropertySource


推荐