@Value配置注入失败

时间:2016-05-04 17:21:47

标签: spring junit code-injection

我正在尝试运行spring JUnit测试用例 - @RunWith(SpringJUnit4ClassRunner.class)来 @ContextConfiguration({" classpath:some.xml"})

xml已定义bean以及内存数据库详细信息

<bean id="orderService" class="com.example.OrderServiceImpl">
        <!-- set properties, etc. -->
    </bean>

我在bean类OrderServiceImpl中进行@Value注入,但是在执行测试用例时没有发生,但是当我运行应用程序时运行相同。你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

您需要将PropertySourcesPlaceholderConfigurer或PropertyPlaceholderConfigurer添加到测试上下文中。这个问题可能会给你一个提示:Populating Spring @Value during Unit Test

答案 1 :(得分:0)

检查some.xmlmain树中是否存在test。如果两者都存在,test树中的那个应该覆盖main分支中的那个。

确保您实际加载的some.xml有一个property-placeholder,例如

<context:property-placeholder location="classpath:some.properties"/>

我意识到有更多现代的方法来管理属性,但这对于单元测试来说很简单,也很容易指定。

我发现多个测试在类路径上的配置文件变得非常笨拙,所以我想利用@ContextConfiguration的一个功能,让我为每个测试创建一个专用的最小配置。它的工作方式是,对于每个测试类,按照惯例,它可以在与测试类包相同的相对目录路径中查找配置文件,并以测试用例命名。这样您就可以完全控制每个测试用例的配置和属性。您可以尝试一下 - 它可以消除共享配置文件引起的混乱。为此,请删除@ContextConfiguration中的值。然后,假设您在com.myCompany.SomeTest中有一个测试用例src/test/java/com/myCompany/。在目录SomeTest-context.xml中创建一个名为src/test/resources/com/myCompany的文件,并将该单元所需的最小配置放在该文件中。按惯例,@ContextConfiguration将在该位置找到该名称的配置文件,并将其用于测试。虽然不是我刚才谈到的约定的一部分,但是我将每个测试的属性文件放在同一目录中,只有我测试所需的属性,也以测试用例命名(例如SomeTest.properties)。在特定于测试用例的上下文中,添加这样的property-placeholder行以获取特定于测试的属性:

<context:property-placeholder location="classpath:com/myCompany/SomeTest.properties"/>

在测试用例的顶部,您可以输入

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration                        // no parameters
public class FileEncryptionUtilsTest { ...

如果你这样做,你就能够为你的内心注入豆类和价值观,而不必担心被添加到共享环境中的事物的副作用或处理由多个错误引起的错误具有相同名称的上下文文件。

关键优势在于您在此处测试单元,而不是由应用程序上下文文件表示的集成。如果您在单元测试中共享应用程序上下文文件,那么您将与bean一起测试应用程序上下文,这更像是集成测试目标,而不是单元测试需求。