模拟静态方法中的静态方法

时间:2017-03-09 19:21:14

标签: java unit-testing powermockito

我有一个静态方法(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?

2 个答案:

答案 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(...);
   }
}