Java 如果构造函数参数之一是type List,是否可以使用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());

我正在使用jMockit对一些新对象进行单元测试。在我的特殊情况下,我试图测试私有构造函数对null参数的反应。考虑这个例子:

公共抽象类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。如果您是正确的,我将失败。这解决了我的问题。如果您拥有正在测试的代码,我将最好将构造函数包私有化,并将测试放在同一个包中(在不同的源代码树中)