Проверка приватного конструктора не вызывается / вызывается с использованием JMockit
У меня есть следующий класс.
public Task {
public static Task getInstance(String taskName) {
return new Task(taskName);
}
private Task(String taskName) {
this.taskName = taskName;
}
}
Я тестирую Task.getInstance()
используя JMockit. Пока я тестирую, мне нужно убедиться, что звонок на private Task()
был на самом деле сделан. Я использовал Verifications
блокируйте ранее, чтобы проверить выполнение метода на объекте тестового объекта, но здесь у меня этого нет.
2 ответа
Это может быть сделано, хотя это, скорее всего, не должно быть в любом правильно написанном тесте:
@Test
public void badTestWhichVerifiesPrivateConstructorIsCalled()
{
new Expectations(Task.class) {{ // partially mocks `Task`
// Records an expectation on a private constructor:
newInstance(Task.class, "name");
}};
Task task = Task.getInstance("name");
assertNotNull(task);
}
@Test
public void goodTestWhichVerifiesTheNameOfANewTask()
{
String taskName = "name";
Task task = Task.getInstance(taskName);
assertNotNull(task);
assertEquals(taskName, task.getName());
}
@Test
public void goodTestWhichVerifiesANewTaskIsCreatedEverytime()
{
Task task1 = Task.getInstance("name1");
Task task2 = Task.getInstance("name2");
assertNotNull(task1);
assertNotNull(task2);
assertNotSame(task1, task2);
}
Опять же, в целом следует избегать как частичного, так и частного методов / конструкторов.
Я не думаю, что вы должны обычно тестировать вызовы частных методов.
Важно то, что ваши входы дают правильные результаты. Я обычно ожидаю, что тесты будут черным ящиком. то есть вы можете изменить реализацию, но компонент все равно даст правильный вывод при тех же входных данных.
Если вы тестируете такие вещи, как закрытые методы, то ваши тесты будут очень чувствительны к рефакторингу, и их функции в качестве регрессионных тестов будут ограничены, так как вам придется рефакторировать тесты вместе с рефакторингами основного кода.