Java 如果构造函数参数之一是type List,是否可以使用null参数测试私有构造函数?
我正在使用jMockit对一些新对象进行单元测试。在我的特殊情况下,我试图测试私有构造函数对null参数的反应。考虑这个例子:Java 如果构造函数参数之一是type List,是否可以使用null参数测试私有构造函数?,java,unit-testing,junit4,jmockit,Java,Unit Testing,Junit4,Jmockit,我正在使用jMockit对一些新对象进行单元测试。在我的特殊情况下,我试图测试私有构造函数对null参数的反应。考虑这个例子: 公共抽象类Foo{ 私有最终字符串昵称; public Foo(最终字符串昵称){ //检查条件 先决条件。checkNotNull(昵称); //做点什么 int i=0;while(i>,但根据,这是一种不好的做法,只能通过铸造实现 即使我把谨慎抛到了九霄云外,并试图沿着 Class listClass=((类)新建ArrayList().getClass());
公共抽象类Foo{
私有最终字符串昵称;
public Foo(最终字符串昵称){
//检查条件
先决条件。checkNotNull(昵称);
//做点什么
int i=0;while(i>,但根据,这是一种不好的做法,只能通过铸造实现
即使我把谨慎抛到了九霄云外,并试图沿着
Class listClass=((类)新建ArrayList().getClass());
Deencapsulation.newInstance(
酒吧,
新类[]{String.Class,String.Class,listClass},
某个字符串,
无效的
一些字符串);
我得到了错误
原因:java.lang.IllegalArgumentException:未找到指定的构造函数:DiscreteSlot(java.lang.String、java.lang.String、java.util.ArrayList)
有什么方法可以执行我正在尝试的操作吗?构造函数参数类型是List
,而不是ArrayList
。只需执行以下操作:
Deencapsulation.newInstance(
Bar.class,
new Class<?>[] {String.class, String.class, List.class}, // use List class literal
someString,
null,
someListOfStrings);
Deencapsulation.newInstance(
酒吧,
新类[]{String.Class,String.Class,List.Class},//使用列表类文字
某个字符串,
无效的
一些字符串);
表达式new ArrayList().getClass()
返回ArrayList.class
,它不等于List.class
构造函数参数类型是List
,而不是ArrayList
。只需执行以下操作:
Deencapsulation.newInstance(
Bar.class,
new Class<?>[] {String.class, String.class, List.class}, // use List class literal
someString,
null,
someListOfStrings);
Deencapsulation.newInstance(
酒吧,
新类[]{String.Class,String.Class,List.Class},//使用列表类文字
某个字符串,
无效的
一些字符串);
表达式new ArrayList().getClass()
返回ArrayList.class
,它不等于List.class您试图调用的构造函数将List
作为第三个参数,因此您应该将List.class
作为数组中的第三个类传递,以便反射性地调用它
但是,您正在传递此表达式的结果:
((Class<List<String>>)new ArrayList<String>().getClass());
由于没有接受ArrayList
的构造函数,它表示找不到构造函数
改为传递List.class
。您试图调用的构造函数将List
作为第三个参数,因此您应该将List.class
作为数组中的第三个类传递,以便反射地调用它
但是,您正在传递此表达式的结果:
((Class<List<String>>)new ArrayList<String>().getClass());
由于没有接受ArrayList
的构造函数,它表示找不到构造函数
改为传递List.class
。参数的类型只是List.class
;所有的listClass
转换都不会让你有任何结果:你实际上传递的是ArrayList.class
,并且没有构造函数重载会接受ArrayList
@AndyTurner。你是正确的,我失败了。这解决了我的问题如果您拥有正在测试的代码,我建议将构造函数包设置为私有,并将测试放在同一个包中(在不同的源代码树中)该参数的类型仅为List.class
;所有的listClass
转换都无法实现:您实际上是在传递ArrayList.class
,并且没有构造函数重载,它接受ArrayList
@AndyTurner。如果您是正确的,我将失败。这解决了我的问题。如果您拥有正在测试的代码,我将最好将构造函数包私有化,并将测试放在同一个包中(在不同的源代码树中)