在我当前的项目中有一种模式被广泛使用:
private Collection<Converter<T>> converters = new HashSet<>();
@Inject
private void init(@Any Instance<Converter<T>> converters) {
for (Converter<T> converter : converters) {
this.converters.add(converter);
}
}
这样,我可以创建任意数量的转换器,它们会自动注入到我的bean中。
我现在的问题是测试:我的代码中使用了converters集合,但是Junit没有调用该init(..)
方法,我需要调用它来设置模拟转换器。
我可以使该方法受保护,但是我对此感到不满意,因为我将更改该方法的可见性范围。
我也可以使用反射来调用该方法,但这也感觉不对。
这使我得出的结论是,可以对该代码进行改进以使其更具可测试性。
无论如何,我是否需要更改此代码,以便提高可测试性,但仍会自动注入引用?
只是继续使其成为“公共”或“受保护”即可。
您实际上并没有获得任何人以这种方式在实例化后更改集合的保护(您只是使它更加尴尬),因此,通过公开该方法不会损失任何东西(事实上,我认为您可以您的班级要好一些,因为比起让人们选择自己想要的结构,而不是强迫使用注入/反射来)。
如果您确实想完全防止实例化后的修改,那么无论如何您都必须转到一个“最终”变量,该变量具有不可修改的集合类型并更改为构造函数注入,但是我没有得到这样的印象是你想做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句