我正在尝试测试一个在构造函数中创建新对象的类。我和Mockito一起使用PowerMock。
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();
答案 0 :(得分:3)
我找到了相同的答案。 如果您正确执行下面给出的步骤,则可以模拟对象。
第1步。 - 添加注释以准备测试类。
@PrepareForTest({ ServiceInvoker.class, ClassNeedToTest.class})
第2步。 - 嘲笑班级。
serviceInvokerMck = Mockito.mock(ServiceInvoker.class);
第3步。 调用new运算符时,使用以下方法模拟对象
PowerMockito.whenNew(ServiceInvoker.class).withAnyArguments().thenReturn(serviceInvokerMck);
我没做的是在ClassNeedToTest
注释中添加类PrepareForTest
,认为应该在那里添加唯一需要模拟的类。
答案 1 :(得分:0)
在类的构造函数中创建对象是不好的做法(依赖性反转原则)。获得此类代码的常用方法是添加一个包私有的新构造函数。
public ClassNeedToTest() throws Exception {
this(new ServiceInvoker("somevalue", "somevalue"));
}
ClassNeedToTest(ServiceInvoker invoker) throws Exception {
this.invoker = invoker;
}
您的测试可以将新构造函数与ServiceInvoker模拟一起使用。之后,您可以将新构造函数设置为public,并将代码重构为仅使用新构造函数。