我试图模拟一个方法,无论调用此方法的实例是什么。据我所知,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.stub
或PowerMockito.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));
但是这个方法仍然执行
答案 0 :(得分:2)
好的,我终于开始工作了。使用stub
和suppress
之一正在运行。测试看起来像这样:
@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)失败。
希望这是明确的,并帮助那些正在努力解决类似问题的人。