这是我的情况,我有2个非常简单的类:
public class B {
public void doSomething(){
System.out.println("doSomething B reached");
}
}
和:
public class A {
public void doSomething(){
B b = new B();
b.doSomething();
System.out.println("doSomething A reached");
}
}
我想用 Mockito 测试方法 doSomething 的 A 类。因此,我想模拟类 B 的一个实例,并在它实例化类 B 时将其提供给 A。出于隔离原因,我根本不希望访问 b.doSomething()。
我知道我可以通过创建以下单元测试来达到这种行为:
@RunWith(PowerMockRunner.class)
public class TestA {
@Test
@PrepareForTest(A.class)
public void testDoSomethingOfA() throws Exception{
A a = PowerMockito.spy(new A());
B b = PowerMockito.mock(B.class);
PowerMockito.whenNew(B.class).withNoArguments().thenReturn(b);
a.doSomething();
}
}
这导致输出:
doSomething A reached
所以这个工作!但是,我现在的问题是我们使用 Jococo 插件进行测试覆盖。Jococo 不涵盖使用 @PrepareForTest(A.class) 语句测试的代码。我的公司重视准确的代码测试覆盖率。
我的问题:有没有另一种方法可以让 A 实例化 B 而不必使用 @PrepareForTest 语句?
提前非常感谢!
要回答我自己的问题,是的,请使用代理: https://github.com/jayway/powermock/wiki/PowerMockAgent
@Rens Groenveld:集成PowerMockAgent后,您是否对测试类或源代码进行了任何更改?我尝试集成PowerMockAgent并从@PrepareForTest中删除了我的主源类,但行为是相同的(创建新实例而不是模拟)。
我已经尝试了jacoco离线仪器和许多其他解决方案,但没有用。
我无法发布到您的评论(需要 50 分),因此添加为答案。