首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟静态方法中的静态方法

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

Stack Overflow用户
提问于 2017-03-10 03:21:14
回答 2查看 2.9K关注 0票数 1

我有一个静态方法(foo),它调用另一个静态方法(bar)。我想在我的测试中模拟bar的反应。使用PowerMockito或其他工具可以做到这点吗?我能找到的唯一结果是在非静态方法中模拟静态。

代码语言:javascript
复制
public class SomeClass {
   static List<String> foo() {
      ...
      int barResult = bar();
      ...
   }

   static int bar() {
      // make a database call
      return DAO.getDao().runQuery();
   }
}

我的测试将把它命名为:

代码语言:javascript
复制
@RunWith(PowerMockRunner.class)
public class SomeClassTest {

   @PrepareForTest(SomeClass.class)
   @Test
   public void fooTest() {
      List<String> actualResult = SomeClass.foo();
      assertTrue(...);
   }
}

我是不是要模仿酒吧的内部结构?所以嘲笑刀?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 03:42:17

你不能这么做。

只有PowerMock允许模拟静态方法。但这是通过“擦除”该类中为PowerMock测试做好“准备”的所有静态内容来实现的。

如果你在谈论普通的方法,你可能会去找Mockito间谍,因为这些方法允许部分模仿。

只是为了记录:简单地避免使用静态,因为使用它会导致“难以测试”的代码。

换句话说:与其使用丑陋的大锤子来“修复”你的设计问题……请考虑修复损坏的设计,从而完全避免对PowerMock的需要!

需要说明的是:是的,您可以通过模拟DAO类上的静态调用来解决您的问题(然后您可以间接控制bar()的作用)。但再说一遍:这只意味着在应该重新编写的代码上贴上“我测试过了”的标签。

票数 1
EN

Stack Overflow用户

发布于 2018-11-27 09:07:18

您可以执行以下操作:

代码语言:javascript
复制
@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(...);
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42703751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档