如何调用在单元测试中注入参数的方法?

时间:2016-06-14 13:59:46

标签: java unit-testing java-ee junit

我目前的项目中广泛使用了一种模式:

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(..)方法,我需要调用它来设置模拟转换器。

我可以保护该方法,但我对此感觉不错,因为我会更改方法的可见范围。

我也可以使用反射调用该方法,但这也感觉不对。

这使我得出结论,可以改进此代码以使其更易于测试。

无论如何,我是否更改了此代码,以便提高可测试性,但仍会自动注入引用?

2 个答案:

答案 0 :(得分:1)

事情是:如果你不能“信任”那些可以在你的“软件包”中编写代码的人......我想在方法上使用“私有”并不能真正帮助你。因为如果人们想要搞砸,并且他们可以在你的包裹中编写代码,他们就会找到解决问题的方法。

含义:如果你删除方法中的“私有”,是的,它会变成包可见。但你可以在上面放一个javadoc,上面写着:“不要直接打电话;只用于单元测试/自动接线”或类似的东西。

答案 1 :(得分:1)

继续前进,让它'公开'或'受保护'。

你实际上没有获得任何保护,因为某人以这种方式改变了实例化后的集合(你刚刚让它变得更加尴尬),所以你不会因为暴露这种方法而失去任何东西(事实上我是认为你让你的课程略胜一筹,因为你要让人们选择他们想要的方式,而不是强迫使用注射/反射。)

如果你确实想要完全防止实例化后修改,那么你将不得不去一个'final'变量,使用不可修改的集合类型并改为构造函数注入,但是我没有得到这就是你想要做的印象。