如何在测试中注入bean的属性源

时间:2018-07-29 15:21:58

标签: java spring unit-testing testing

我正在Java春季为我的服务编写单元测试。我模拟了测试类中的所有依赖关系,并在构造函数中实例化了测试类,并向其传递了模拟类。问题在于,经过测试的类将.properties文件中的属性注入到其内部的字段中(例如字符串)。

在测试的类中,我在类级别使用@PropertySource和在字段级别使用@Value的标准组合。

我们知道,当通过构造函数实例化类时,属性注入失败(在Spring Container初始化期间不是作为bean实例化)。您如何处理此类问题?

我有一个解决方案,尽管我认为这是不好的并且不能令人满意,但是: 1.正常@Autowire到受测类,然后使用设置器替换其所有依赖项。

我也知道@TestPropertySource批注,如果我理解正确,它不会提供解决方案,它只是覆盖已经存在的属性的一种方法-并非如此,因为我们不能真正使用任何注释属性。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

这很简单:在单元测试中,将属性注入到String字段中,然后在容器加载Spring上下文之后调用的hook方法中,而不是在测试类的构造函数中创建要测试的对象。 br /> 在JUnit 4中,可以使用@Before指定此挂钩方法,在JUnit 5中可以使用@BeforeEach指定挂钩方法。

它会给出类似的内容:

@RunWith(SpringJUnit4ClassRunner.class)
public class FooTest{

    Foo foo;
    @Value("${myProp}") 
    String myProp;

    @BeforeEach
    public void beforeEach(){
       foo = new Foo(myProp);
    }
}

请注意,为了使测试更快地执行,您应该仅从Spring上下文中加载测试所需的内容:环境部分。