java - 在需要测试的类上使用 powermock 模拟构造函数

标签 java junit mockito powermock powermockito

我可以使用 powermock 从我想要测试的类内部模拟构造函数调用。当我在 @PrepareForTest 中添加我想要测试的类时,这会起作用。但是一旦我在那里添加我的类,即使测试用例通过,覆盖率在覆盖率插件中也会显示为 0。

当我从@PrepareForTest中删除我的类时,当然,其他测试用例的覆盖率开始显示,但我必须模拟构造函数调用的测试用例失败了。不知道该怎么办。

Class A
{
   MyObject o;
   A(){
     //some other code
     o = new MyObject();
     //some other code
   }

  public void process(){
    //some code

}

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
Class TestA{

  @Test
  public void test1()
  {
    MyObject mocked = Mockito.mock(MyObject.class);
 PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(mocked);
  A a = new A();
  a.process();
  //Assert as per test case

 }

}

在覆盖率工具中,覆盖率显示为 0,但是单元测试通过了,我在 Debug模式下检查它覆盖了 A 类的所有语句。

最佳答案

In coverage tool, coverage shows as 0 however, unit test passes and I checked in debug mode that it was covering all the statements of class A.

覆盖工具依赖于操作执行的字节代码。

当你模拟 static/new 时,PowerMock 也是如此。

这很快就会导致各种问题。对于JaCoCo来说,似乎有一个围绕offline instrumentation的解决方案。哪里,我还记得:不久前还有人问过这个问题,最后放弃了,因为他也无法让“离线仪器”工作。

对于任何其他框架,我必须重复旧的建议:考虑投入时间来学习如何编写易于测试的代码。因为如果您这样做,您就不需要使用 PowerMock(ito) 来测试它。

由于构造函数中的 new() 语句,您的代码很难测试。只是不要这样做。要么通过 @InjectMocks 使用依赖注入(inject),要么使用一个仅测试的构造函数来获取所需的对象。

长话短说:当您编写自己的新代码,并且您认为需要 PowerMock 来测试它时,那么您就做错了。

关于java - 在需要测试的类上使用 powermock 模拟构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56626404/

相关文章:

java - 强制接口(interface)中指定的方法仅在抽象类外部定义

eclipse - Buckminster: headless (headless)运行 JUnit 插件测试

unit-testing - PowerMock、Mockito 和来自反射 api 的模拟最终类

java - 模拟类型转换对象

java - Libgdx:绕z轴旋转(矩阵变换)

java - 将 int 转换为 string 减少了计算其长度的时间复杂度

java - 南 : Aynchronous parallel computing

java - 如果我的子步骤文件已经扩展了一个类,如何创建 MasterStep/BaseStep?

java - org.springframework.boot.test.mock.mockito.MockReset 上的 NoClassDefFoundError

java - Mockito 无法注入(inject)模拟