gpt4 book ai didi

java - 如果构造函数参数之一是 List 类型,是否可以使用 null 参数测试私有(private)构造函数?

转载 作者:行者123 更新时间:2023-12-02 03:34:30 25 4
gpt4 key购买 nike

我正在使用 jMockit 对一些新对象进行单元测试。在我的特定情况下,我试图测试私有(private)构造函数对空参数的 react 。考虑这个例子:

public abstract class Foo {

private final String nickname;

public Foo(final String nickname) {
// Check condition
Preconditions.checkNotNull(nickname);
// Do some stuff
int i=0; while (i<10) {i++; System.out.println("I can count to "+i);}
// Store value
this.nickname = nickname;
}

public boolean isItMyName(String alias) {
return (nickname.equalsIgnoreCase(alias));
}

}

public class Bar extends Foo {

private final String professionalNickname;
private final List<String> jailhouseNicknames = new ArrayList<String>();

private Bar(final String casualNickname,
final String professionalNickname,
final List<String> jailhouseNicknames) {
super(casualNickname);
Preconditions.checkNotNull(professionalNickname);
Preconditions.checkNotNull(jailhouseNicknames);
this.professionalNickname = professionalNickname;
this.jailhouseNicknames.addAll(jailhouseNicknames);
}

@Override
public boolean isItMyName(String alias) {
if (super.isItMyName(alias)) return true;
if (professionalNickname.equalsIgnoreCase(alias)) return true;
for (String nick : jailhouseNicknames)
if (nick.equalsIgnoreCase(alias)) return true;
return false;
}

}

如果我想使用 jMockit 测试 Bar 构造函数,我可以使用 Deencapsulation.newInstance(Class classToInstantiate, Object... nonNullArgs)。然而,就我而言,我希望参数之一(特别是字符串之一)为空引用。在这种情况下,我必须使用 Deencapsulation.newInstance(Class classToInstantiate, Class[]parameterTypes, Object... initArgs) 方法。这需要我传入 Class< List< String >> ,但根据 this past answer ,这是不好的做法,只能通过强制转换来实现。

即使我确实把谨慎抛到九霄云外,尝试一些类似的事情

Class<List<String>> listClass = ((Class<List<String>>)new ArrayList<String>().getClass());
Deencapsulation.newInstance(
Bar.class,
new Class<?>[] {String.class, String.class, listClass},
someString,
null,
someListOfStrings);

我收到错误

Caused by: java.lang.IllegalArgumentException: Specified constructor not found: DiscreteSlot(java.lang.String, java.lang.String, java.util.ArrayList)

有办法做我正在尝试的事情吗?

最佳答案

您尝试调用的构造函数将 List 作为第三个参数,因此您应该将 List.class 作为数组中的第三个类传递,以便调用反射(reflection)一下。

但是,您正在传递此表达式的结果:

((Class<List<String>>)new ArrayList<String>().getClass());

等于

ArrayList.class

由于没有采用 ArrayList 的构造函数,因此表示未找到构造函数。

改为传递List.class

关于java - 如果构造函数参数之一是 List 类型,是否可以使用 null 参数测试私有(private)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com