Если вы правильно поняли, вы хотите протестировать класс с издеваемым конструктором. Это не очень хороший подход к тестированию, потому что вы не тестируете производственный код в его самой чистой форме.
Однако не все идет по правилам, не так ли? :) Итак, если вы настаиваете, JMockIt позволит вам это сделать. Вы можете высмеять только конструктор и проверить другие методы. Сверкающие конструкторы хорошо документированы на JMockIt project site.
Вот быстрая демонстрация вы можете попробовать себя: код
Продукции:
// src/main/java/pkg/SomeClass.java
public class SomeClass {
public static void main(String[] args) {
new SomeClass("a", 2);
}
public SomeClass(String a, Integer b) {
System.out.println("Production constructor called");
}
}
Пробный код:
// src/test/java/pkg/SomeMock.java
import mockit.Mock;
import mockit.MockUp;
public class SomeMock extends MockUp<SomeClass> {
@Mock
public void $init(String a, Integer b) {
System.out.println("Mock constructor called");
}
}
Код испытания:
// srce/test/java/pkg/SomeTest.java
import org.junit.Test;
public class SomeTest {
@Test
public void test() {
new SomeMock();
new SomeClass("a", 2);
}
}
Запуск производство код будет печатать Production constructor called
, но при запуске его теста будет напечатано Mock constructor called
.
Спасибо за ответ. Я бы попробовал. – userx
'Если я правильно понял вас, вы хотите протестировать класс с издеваемым конструктором. Это не очень хороший подход к тестированию, потому что вы не тестируете производственный код в чистом виде. «Я полностью не согласен. Единичное тестирование (тестирование белого ящика - именно то, для чего используется JMockit) в самой чистой форме - это тестирование отдельных блоков. Если вы тестируете конкретный блок, который не является сложным конструктором, то его выполнение - это тестирование черного ящика, которое невероятно плохо, когда вы пытаетесь выполнить модульное тестирование. – searchengine27
, но как вы устанавливаете поля объекта при издевательстве вашего конструктора (внутри метода $ init())? – supertonsky