Можно ли создать экземпляр класса с помощью сложного конструктора без насмешек или вызова его конструктора?Это было бы полезно, потому что класс модульного теста не должен изменяться каждый раз, когда в службу добавляется новая зависимость.
Пересечение службы решает проблему путем создания новой реализации класса с пустым методом.переопределяет, но это не пример реализации.Это проблема, потому что каждый раз, когда вызывается метод в mocked-сервисе, Mockito нужно сказать, чтобы он вызывал реальный метод.Вместо этого предпочтительнее было бы использовать реальную реализацию службы.
Например:
class ComplexService {
private Service service1;
private Service service2;
private Service service3;
private Service service4;
private Service service5;
ComplexConstructor(Service service1, Service service2, Service service3, Service service4, Service service5) {
this.service1 = service1;
this.service2 = service2;
this.service3 = service3;
this.service4 = service4;
this.service5 = service5;
}
boolean methodToTest() {
return service1.get();
}
}
В классе модульного теста возможно создание экземпляра реализации без вызоваего конструктор?
public class ComplexConostructorTest {
private ComplexConstructor complexConstructor;
private Service serviceMock;
@Before
public void init() {
/*
Somehow create implementation of complexConstructor
without calling constructor
. . .
*/
// Mock dependency
ReflectionTestUtils.setField(complexConstructor,
"service1",
serviceMock = Mockito.mock(Service.class));
}
@Test
public void service1Test() {
when(serviceMock.get())
.thenReturn(true);
assertTrue(complexConstructor.methodToTest());
}
}
Редактировать
Можно использовать отражение, я надеялся, что в JUnit или Mockito был встроен способ для достижения того же самого.Вот как это сделать, используя отражение.
@Before
public void init() {
Constructor<?> constructor = ComplexConstructor.class.getConstructors()[0];
complexConstructor = (ComplexConstructor) constructor.newInstance(new Object[constructor.getParameterCount()]);
// Mock dependency
ReflectionTestUtils.setField(complexConstructor,
"service1",
serviceMock = Mockito.mock(Service.class));
}