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



我正在尝试测试一个在构造函数中创建新对象的类。我正在使用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 模拟一起使用。之后,您可以将新构造函数设为公共,并将代码重构为仅使用新构造函数。

相关内容

  • 没有找到相关文章

最新更新