是否可以在不模拟或调用其构造函数的情况下实例化具有复杂构造函数的类?这将很有用,因为每次将新的依赖项添加到服务时,单元测试类都不需要更改。
模拟服务通过创建类的新实现来解决问题,并覆盖空方法,但这不是实现的实例。这是一个问题,因为每当调用模拟服务中的方法时,都必须告诉 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));
}
江户川乱折腾
噜噜哒
达令说
慕姐4208626
相关分类