我可以在要测试的类中使用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工具中,coverage显示为0,但是,单元测试通过了,我在调试模式下检查它是否覆盖了A类的所有语句。
最佳答案
在coverage工具中,coverage显示为0,但是,单元测试通过了,我在调试模式下检查它是否覆盖了A类的所有语句。
覆盖率工具依赖于操纵执行的字节码。
当您模拟static / new时,PowerMock也是如此。
这会很快导致各种问题。对于JaCoCo,似乎在offline instrumentation周围有解决方案。我还记得在哪里:不久前有人问了这个问题,最后放弃了,因为他也无法获得“离线工具”的支持。
对于任何其他框架,我必须重复旧的建议:考虑花费您的时间来学习如何编写易于测试的代码。因为如果这样做,则无需使用PowerMock(ito)对其进行测试。
由于构造函数中的new()
语句,因此代码难以测试。根本就不要那样做。通过@InjectMocks使用依赖项注入,或者使用仅测试的构造函数来获取所需的对象。
长话短说:当您编写自己的新代码,并且认为需要PowerMock对其进行测试时,您就在做错事情。