我有一个静态方法(foo)调用另一个静态方法(bar)。我想在我的测试中嘲笑bar的反应。这可能与PowerMockito或其他工具有关吗?我能找到的唯一结果就是在非静态方法中模拟静态。
public class SomeClass {
static List<String> foo() {
...
int barResult = bar();
...
}
static int bar() {
// make a database call
return DAO.getDao().runQuery();
}
}
我的测试会称之为:
@RunWith(PowerMockRunner.class)
public class SomeClassTest {
@PrepareForTest(SomeClass.class)
@Test
public void fooTest() {
List<String> actualResult = SomeClass.foo();
assertTrue(...);
}
}
我是否必须嘲笑酒吧的内部?那么嘲笑DAO?
答案 0 :(得分:1)
你不能这样做。
只有PowerMock允许您模拟静态方法。但这可以通过&#34;擦除&#34;该类中所有静态的东西都得到了准备和#34;供PowerMock测试。
如果你在谈论普通方法,你可能会选择Mockito间谍,因为那些允许部分嘲弄。
只是为了记录:简单地避免使用静态,因为使用它会导致难以测试&#34;码。
换句话说:而不是使用大丑陋的电动摇锤来修复&#34;你的设计问题......考虑修复破损的设计,从而完全避免使用PowerMock!
并且为了记录:是的,你可以通过在DAO类上模拟静态调用来解决你的问题(然后你可以间接控制bar()做什么。但是再次:这只是意味着把#34;我测试了它并且#34;标记了应该重新编写的代码。
答案 1 :(得分:0)
您可以这样做:
@RunWith(PowerMockRunner.class)
@PrepareForTest({SomeClass.class, DAO.class})
public class SomeClassTest {
@Test
public void fooTest() {
PowerMockito.mockStatic(DAO.class);
Mockito.when(DAO.getDao().runQuery()).return(..);
List<String> actualResult = SomeClass.foo();
assertTrue(...);
}
}