PowerMock什么时候没有@PrepareForTest?

时间:2014-02-26 14:24:47

标签: java unit-testing testing mockito powermock

这是我的情况,我有两个非常简单的课程:

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测试A类的方法doSomething。因此,我想模拟一个B类的实例,并在实例化B类时将其交给A。出于隔离原因,我根本不想要b.doSomething()。

我知道我可以通过创建以下unittest来实现此行为:

@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)语句测试的代码。我公司重视准确的代码测试覆盖率。

我的问题:是否有另一种方法可以在不必使用@PrepareForTest语句的情况下给A实例化B?

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

要回答我自己的问题,是的,请使用代理:https://github.com/jayway/powermock/wiki/PowerMockAgent

答案 1 :(得分:0)

@Rens Groenveld:集成PowerMockAgent之后,您是否对测试类或源代码进行了任何更改?我尝试集成PowerMockAgent,并从@PrepareForTest中删除了我的主要源类,但是行为是相同的(创建新实例而不是模拟实例)。

我尝试了jacoco脱机工具和许多其他解决方案,但没有用。

我无法在您的评论中发表(需要50分),因此无法添加为答案。