繁体   English   中英

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

[英]Spring setter dependency injection and immutable object

我们知道,Spring团队建议在现场注入中使用二传手注入:

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

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

但是,让我烦恼的是,由于弹簧bean是单例,因此如果在代码的某些部分中,通过使用setter方法注入不同的依赖关系来重新配置单例bean,那么代码的其他部分将成为影响,这可能是不必要的。 例如,在代码的某些部分中注入了特定的时钟实例,但在代码的其他部分中可能不希望使用这种特定类型的时钟。

因此,看起来像是二传手注,这为高风险业务留下了一些机会。 同时,我们需要一种在测试过程中注入一些模拟的机制。 我们如何才能取得平衡?

此外,我们知道可变对象是不可取的:

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

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

在这里听起来有些混乱,一方面您说:

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

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

但是随后您继续说:

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

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

如果您确实需要更改实例字段但没有设置器,那么作为最后的选择,您仍然可以在测试过程中使用ReflectionTestUtils更新字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM