需要在要测试的类的构造函数中模拟对象的创建

时间:2014-03-06 06:11:31

标签: junit mocking mockito powermock

我正在尝试测试一个在构造函数中创建新对象的类。我和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();

2 个答案:

答案 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,并将代码重构为仅使用新构造函数。