我正在尝试测试一个在构造函数中创建新对象的类。我正在使用PowerMock和Mockito。
public ClassNeedToTest() throws Exception {
String targetCategory = "somevalue";
String targetService = "somevalue";
invoker = new ServiceInvoker(targetCategory, targetService); // throws Exception
}
对于上面给定的代码,我正在尝试创建一个ClassNeedToTest
实例来测试该类的不同方法。我无法创建对象ServiceInvoker
因为创建会引发异常。ServiceInvoker
类是第三方类。有没有办法模拟ServiceInvoker,以便在测试类尝试创建ClassNeedToTest
时,我可以获取ServiceInvoker
的模拟对象,而不是真正调用ServiceInvoker
的构造函数。
在我的测试类中,我只是创建了一个新的ClassNeedToTest实例:
ClassNeedToTest obj = new ClassNeedToTest();
我找到了同样的答案。如果您正确遵循以下步骤,则可以模拟对象。
第 1 步。 - 添加注释以准备测试类。
@PrepareForTest({ ServiceInvoker.class, ClassNeedToTest.class})
第 2 步。 - 模拟班级。
serviceInvokerMck = Mockito.mock(ServiceInvoker.class);
第 3 步。使用以下方法在调用新运算符时模拟对象
PowerMockito.whenNew(ServiceInvoker.class).withAnyArguments().thenReturn(serviceInvokerMck);
我没有做的是在注释中添加类ClassNeedToTest
PrepareForTest
认为应该在那里添加唯一需要嘲笑的类。
在类的构造函数中创建对象是一种不好的做法(依赖反转原则)。获取此类代码的常用方法是添加一个包私有的新构造函数。
public ClassNeedToTest() throws Exception {
this(new ServiceInvoker("somevalue", "somevalue"));
}
ClassNeedToTest(ServiceInvoker invoker) throws Exception {
this.invoker = invoker;
}
您的测试可以将新的构造函数与 ServiceInvoker 模拟一起使用。之后,您可以将新构造函数设为公共,并将代码重构为仅使用新构造函数。