使用静态方法处理最终类

时间:2015-11-16 11:11:14

标签: java junit mocking refactoring mockito

我有一个方法,我想测试一下。在那里,我调用最终Hybris类(Config.getParameter("aString"))的静态方法。我想嘲笑它,但我发现,你不能用Mockito做到这一点。那么接近这个的好方法是什么?问题是,我正在考虑重构。但是我无法改变Config级别,因为它来自Hybris。

如何更改我要测试的课程,以便我可以影响Config.getParameter("aString")来电?

谢谢!

3 个答案:

答案 0 :(得分:2)

一种解决方案是创建一个接口,其方法(或方法)与您对Config类的期望值相匹配。然后,您可以执行以下操作:

  • 创建一个在生产中使用Config的实现;
  • 为您的测试创建一个模拟。

使用Java 8的简化示例:

// The interface
public interface MyInterface
{
    String getParameter(String paramName);
}

// Class using the interface
public final class MyClass
{
    private final MyInterface intf;

    // For testing...
    public MyClass(final MyInterface intf)
    {
        this.intf = Objects.requireNonNull(intf);
    }

    // In production...
    public MyClass()
    {
        this(Config::getParameter);
    }

    // etc
}

// Test class
@Test
public void whatever()
{
    final MyInterface intf = mock(MyInterface.class);
    // set up the mock, then...

    final MyClass myClass = new MyClass(intf);
    // test myClass
}

答案 1 :(得分:2)

除了Mockito之外,您还可以使用工具调用PowerMock,它可以对您的用例有所帮助。

答案 2 :(得分:2)

有两种方法可以做到:

1.重构您的代码并引入ConfigWrapper(例如)接口:

public interface ConfigWrapper {
   public String getParameter(String parameter);

public class ConfigWrapperImpl implements ConfigWrapper{
   public String getParameter(String parameter){
      return Config.getParameter(parameter);
   }
}

然后你应该重构代码并通过注入ConfigWrapper来替换Config。*用法。当你编写测试时,可以使用mockito轻松模拟ConfigWrapper(因为你使用的是非静态方法)

  1. 第二种方法是使用PowerMock而不是mockito:

    PowerMock.mockStatic(ClassThatContainsStaticMethod.class)

  2. 了解更多信息,您可以看到:https://github.com/jayway/powermock/wiki/MockStatic