我目前的项目中广泛使用了一种模式:
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。
我现在的问题是测试:转换器集合在我的代码中使用,但是Junit没有调用init(..)
方法,我需要调用它来设置模拟转换器。
我可以保护该方法,但我对此感觉不错,因为我会更改方法的可见范围。
我也可以使用反射调用该方法,但这也感觉不对。
这使我得出结论,可以改进此代码以使其更易于测试。
无论如何,我是否更改了此代码,以便提高可测试性,但仍会自动注入引用?
答案 0 :(得分:1)
事情是:如果你不能“信任”那些可以在你的“软件包”中编写代码的人......我想在方法上使用“私有”并不能真正帮助你。因为如果人们想要搞砸,并且他们可以在你的包裹中编写代码,他们就会找到解决问题的方法。
含义:如果你删除方法中的“私有”,是的,它会变成包可见。但你可以在上面放一个javadoc,上面写着:“不要直接打电话;只用于单元测试/自动接线”或类似的东西。
答案 1 :(得分:1)
继续前进,让它'公开'或'受保护'。
你实际上没有获得任何保护,因为某人以这种方式改变了实例化后的集合(你刚刚让它变得更加尴尬),所以你不会因为暴露这种方法而失去任何东西(事实上我是认为你让你的课程略胜一筹,因为你要让人们选择他们想要的方式,而不是强迫使用注射/反射。)
如果你确实想要完全防止实例化后修改,那么你将不得不去一个'final'变量,使用不可修改的集合类型并改为构造函数注入,但是我没有得到这就是你想要做的印象。