Spring setter依赖注入和不可变对象

时间:2017-04-02 00:13:22

标签: java spring

我们知道春季团队建议使用二次注射比场注射:

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/beans.html#d0e2778

通过注入模拟也需要进行单元测试。

然而,有一点让我困扰的是,因为spring bean是单例,所以如果在代码的某些部分,通过使用setter方法注入不同的依赖关系来重新配置单例bean,那么代码的其他部分是会受到影响,这可能是不受欢迎的。例如,在代码的某些部分中注入特定的时钟实例,但可能是在代码的其他部分中不希望特定种类的时钟。

所以看起来,注册公司的注入为风险投资敞开了大门。同时我们需要一种机制来在测试期间注入一些模拟。我们怎样才能取得平衡?

此外,我们知道可变对象是不受欢迎的:

http://www.javapractices.com/topic/TopicAction.do?Id=15

那么使用可用于单例bean的setter方法还不错吗?

1 个答案:

答案 0 :(得分:0)

这里听起来有点混乱,一方面你说:

  

通过注入模拟进行单元测试

在这里,您可以使用Mockito或标准JUnit测试来创建实例并注入相应的依赖项。

然后你继续说:

  

代码的其他部分将受到影响,这可能是不受欢迎的

不完全单元测试,但您可以使用@DirtiesContext的Spring Test支持来确保如果您在一个测试中更改了依赖项,那么将为下一个测试重新加载上下文。

如果您确实需要更改实例字段但没有setter,作为最后的手段,您仍然可以使用ReflectionTestUtils在测试期间更新字段。