使用PowerMockito对类的所有实例进行模拟方法

时间:2016-07-09 13:54:00

标签: java unit-testing mockito powermockito

我试图模拟一个方法,无论调用此方法的实例是什么。据我所知,Mockito不会发生这种情况,应该用PowerMockito来完成,但我无法弄清楚它应该如何完成。 我有

public class B{
    public void veryAnnoyingMethod(int i, short s){}
}
public class A{
    public void veryImportantMethod(){
        B newB = new B();
        newB.veryAnnoyingMethod(i,s);
        ...
    }
}

我正在尝试测试veryImportantMethod()并想要模拟veryAnnoyingMethod()。 我不想按照这里解释的那样嘲笑构造函数:Mocking methods of local scope objects with Mockito因为除了veryAnnoyingMethod()我需要newB完全正常运行。

我想出了类似的东西:

B dummyB = PowerMockito.spy(new B());
PowerMockito.doReturn(null).when(dummyB.veryAnnoyingMethod(Mockito.anyInt(), Mockito.anyShort()));

但它引发异常,我认为这不是我真正需要的。

更新

经过多一点阅读后,似乎我必须使用PowerMockito.stubPowerMockito.supress。所以我尝试了以下内容:

PowerMockito.stub(PowerMockito.method(B.class, "veryAnnoyingMethod", int.class, short.class)).toReturn(null);

PowerMockito.supress(PowerMockito.method(B.class, "veryAnnoyingMethod", int.class, short.class));

但是这个方法仍然执行

1 个答案:

答案 0 :(得分:2)

好的,我终于开始工作了。使用stubsuppress之一正在运行。测试看起来像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest(B.class)
class TestClassAWithPowerMockito{
    @Test
    public void testVeryImportantMethod() throws Exception {
        A a = new A();
        PowerMockito.suppress(PowerMockito.method(B.class, "veryAnnoyingMethod", int.class, short.class));
        a.veryImportantMethod();
        ...
    }
}

注意@RunWith(PowerMockRunner.class)@PrepareForTest(B.class) 我不得不在单独的类中使用PowerMockito进行测试,因为添加这两个符号使我的其他一些测试(不使用PowerMockito,但只有Mockito)失败。

希望这是明确的,并帮助那些正在努力解决类似问题的人。