Я использую jMockit для модульного тестирования некоторых новых объектов. В моем конкретном случае я пытаюсь проверить реакцию частного конструктора на нулевой параметр. Рассмотрим пример:
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;
}
}
Если я хочу протестировать конструктор Bar с помощью jMockit, я могу использовать Deencapsulation.newInstance(Class classToInstantiate, Object... nonNullArgs). Однако в моем случае я хочу, чтобы один из параметров (в частности, одна из строк) был нулевой ссылкой. В этом случае я должен использовать метод Deencapsulation.newInstance(Class classToInstantiate, Class[] parameterTypes, Object... initArgs). Это потребует от меня пройти в Class‹ List‹ String > >, но в соответствии с этот прошлый ответ, это плохая практика и возможна только путем приведения типов.
Даже если я отброшу осторожность на ветер и попытаюсь сделать что-то вроде
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);
я получаю ошибку
Вызвано: java.lang.IllegalArgumentException: указанный конструктор не найден: DiscreteSlot(java.lang.String, java.lang.String, java.util.ArrayList)
Есть ли способ сделать то, что я пытаюсь?
List.class
; все это приведениеlistClass
ни к чему не приведет: вы на самом деле передаетеArrayList.class
, и нет перегрузки конструктора, которая принимаетArrayList
. - person Andy Turner   schedule 02.06.2016