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

Java 在需要测试的类上使用powermock模拟构造函数,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,我能够在我想要测试的类中使用powermock模拟构造函数调用。当我在@PrepareForTest中添加我想要测试的类时,这就起作用了。但是一旦我在那里添加了我的类,即使测试用例通过,覆盖率在覆盖率插件中也显示为0 当然,当我从@PrepareForTest中删除类时,其他测试用例的覆盖率开始出现,但我必须模拟构造函数调用的测试用例失败。不知道该怎么办 Class A { MyObject o; A(){ //some other code o = new My

我能够在我想要测试的类中使用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

 }

}

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

我认为您可以在这里不使用Powermock。如果你监视class
A
并模拟getter,你应该得到相同的结果,并且很可能你的覆盖率是正确的:

@Test
public void test1(){
    MyObject mocked = Mockito.mock(MyObject.class);
    A spyA = Mockito.spy(new A());
    doReturn(mocked).when(spyA).getMyObject();
    ...
}

我想这里没有Powermock也行。如果你监视class
A
并模拟getter,你应该得到相同的结果,并且很可能你的覆盖率是正确的:

@Test
public void test1(){
    MyObject mocked = Mockito.mock(MyObject.class);
    A spyA = Mockito.spy(new A());
    doReturn(mocked).when(spyA).getMyObject();
    ...
}
在coverage tool中,coverage显示为0,然而,单元测试通过了,我在调试模式下检查它是否覆盖了类A的所有语句

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

当您模拟静态/新建时,PowerMock也是如此

这会很快导致各种各样的问题。对于JaCoCo来说,似乎有一个解决方案。在哪里,我还记得:前一段时间有人问过这件事,但最终还是放弃了,因为他也无法让“离线检测”工作

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

由于构造函数中的
new()
语句,您的代码很难测试。别那么做。通过@InjectMocks使用依赖项注入,或者使用一个只测试的构造函数获取所需的对象

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

在coverage tool中,coverage显示为0,然而,单元测试通过了,我在调试模式下检查它是否覆盖了类A的所有语句

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

当您模拟静态/新建时,PowerMock也是如此

这会很快导致各种各样的问题。对于JaCoCo来说,似乎有一个解决方案。在哪里,我还记得:前一段时间有人问过这件事,但最终还是放弃了,因为他也无法让“离线检测”工作

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

由于构造函数中的
new()
语句,您的代码很难测试。别那么做。通过@InjectMocks使用依赖项注入,或者使用一个只测试的构造函数获取所需的对象


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

基本上,我只想避免对new MyObject()的实际构造函数调用。我已经修改了我的问题,以便根据我的用例(删除了getter)将其弄清楚。为了不使用Powermock,间谍似乎是唯一的解决方案。唯一的问题是,无论何时需要使用MyObject,都必须使用getter基本上,我只想避免实际调用new MyObject()。我已经修改了我的问题,以便根据我的用例(删除了getter)将其弄清楚。为了不使用Powermock,间谍似乎是唯一的解决方案。唯一的问题是,无论何时需要使用MyObject,都必须使用getter