我有一个静态方法(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(...);
}
}我是不是要模仿酒吧的内部结构?所以嘲笑刀?
发布于 2017-03-10 03:42:17
你不能这么做。
只有PowerMock允许模拟静态方法。但这是通过“擦除”该类中为PowerMock测试做好“准备”的所有静态内容来实现的。
如果你在谈论普通的方法,你可能会去找Mockito间谍,因为这些方法允许部分模仿。
只是为了记录:简单地避免使用静态,因为使用它会导致“难以测试”的代码。
换句话说:与其使用丑陋的大锤子来“修复”你的设计问题……请考虑修复损坏的设计,从而完全避免对PowerMock的需要!
需要说明的是:是的,您可以通过模拟DAO类上的静态调用来解决您的问题(然后您可以间接控制bar()的作用)。但再说一遍:这只意味着在应该重新编写的代码上贴上“我测试过了”的标签。
发布于 2018-11-27 09:07:18
您可以执行以下操作:
@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(...);
}
}https://stackoverflow.com/questions/42703751
复制相似问题