Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何调用在单元测试中注入参数的方法?_Java_Unit Testing_Jakarta Ee_Junit - Fatal编程技术网

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

Java 如何调用在单元测试中注入参数的方法?,java,unit-testing,jakarta-ee,junit,Java,Unit Testing,Jakarta Ee,Junit,在我当前的项目中,有一种模式被广泛使用: private Collection<Converter<T>> converters = new HashSet<>(); @Inject private void init(@Any Instance<Converter<T>> converters) { for (Converter<T> converter : converters) { this.

在我当前的项目中,有一种模式被广泛使用:

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);
    }
}
private Collection converters=new HashSet();
@注入
私有void init(@任何实例转换器){
用于(转换器:转换器){
this.converts.add(converter);
}
}
通过这种方式,我可以创建任意数量的转换器,并将它们自动注入到我的bean中

我现在的问题是测试:我的代码中使用了converters集合,但是Junit没有调用
init(…)
方法,我需要调用它来设置模拟的转换器

我可以使该方法受到保护,但我觉得不合适,因为我会更改该方法的可见性范围

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

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

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

问题是:如果你不能“信任”那些可以在你的“包”中编写代码的人。。。我想在一个方法上使用“private”并不能真正帮助你。因为如果人们想搞砸,他们可以在你的包中编写代码,他们无论如何都会想办法搞砸


意思:如果您在方法上删除“private”,则它将变为可见的包。但是你可以在上面放一个javadoc,上面写着:“不要直接调用;只用于单元测试/自动连接”或者类似的东西

继续,让它“公开”或“受保护”

通过这种方式更改集合后实例化,您实际上并没有从某人那里获得任何保护(您只是让它变得有点尴尬),因此您不会因为公开该方法而丢失任何东西(事实上,我认为你让你的类稍微好一点,因为你让人们选择他们想要构建的方式,而不是强制使用注入/反射)


如果您确实想完全阻止实例化后的修改,那么您将不得不使用“final”变量,使用不可修改的集合类型并更改为构造函数注入,但我不认为这就是您想要做的。

为什么您仍然需要这样做?为什么不将实例保留为typ是否创建一个字段转换器并将其直接注入字段?@NicolasFilotto这样做会在集合的每个迭代器上创建一个新的my Converter实例