【问题标题】:Static-Methods and what to do with them静态方法以及如何处理它们
【发布时间】:2015-12-03 08:16:54
【问题描述】:

在编写一些单元测试时,我发现我们使用了大量来自实用程序类的静态方法调用。现在有了 Mockito,我无法模拟他们的呼唤。那么最好的方法是什么?

我知道在我刚刚返回静态调用的类中编写了公共方法。例如:

public String getName(File file){ return PDFUtil.getName(file); }

然后我在另一个方法中调用公共方法。现在我可以使用带有间谍功能的 Mockito 模拟 getName() 方法。

但是有两件事:

  1. 存在冗余。我可能也会在其他类中使用PDFUtil.getName(File) 方法,所以我应该只有一个类并且应该只实现一次getName()。
  2. 假设我有 4 种不同的静态方法调用,并将它们提取到 4 种不同的方法中。这些现在是我无法测试的方法。那么这样可以吗,因为据说不应该测试 getter 和 setter 等非常简单的方法?

【问题讨论】:

  • 现在有了 Mockito,我无法模拟他们的调用。”如果你先写测试会容易很多。
  • 你为什么需要来模拟它们?这些方法是否可以在测试期间执行不应该执行的工作?
  • 查看具有 mockStatic () 的 powermock / powermockito
  • 将不能在单元测试中使用的静态实用程序方法重构为可以注入的实用程序对象的非静态方法(最好作为参数传递给的构造函数)需要它们的对象。

标签: java spring unit-testing mockito


【解决方案1】:

您可以直接使用PowerMock 模拟静态方法。假设你有这个类:

public class StaticMethodClass {
   public String method() {
       return StaticMethodClass.staticMethod();
   }

   public static String staticMethod() {
      return "hello world";
   }
}

单元测试可能如下所示:

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticMethodClass.class)
public class UnitTest {

   @Test
   public void test() {
      PowerMockito.mockStatic(StaticMethodClass.class);
      PowerMock.when(StaticMethodClass.staticMethod()).thenReturn("yeah");

      assertEquals("yeah", new StaticMethodClass().method());
   }
}

注意:我实际上并没有测试此代码。把它当作一个提示:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 2014-06-23
    • 2016-07-17
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多