【问题标题】:Static methods are sort of code smell?静态方法有点代码味道?
【发布时间】:2014-06-12 05:53:53
【问题描述】:

我最近正在使用 JUnit 和 Mockito 进行 TDD。出于某种方法内的目的,我使用了 Util 类(在项目上下文中具有方法的实用程序类)。我面临的问题是如何在 Mockito 中模拟此类课程。我无法在 Mockito 中找到有关静态方法的此类实现。有人建议在 Mockito 之上使用 PowerMock,但这不会取代我的 JunitMockitoRunner 吗?

我使用静态函数的方式是:

public void doSomething(int x){

    //Some code

    Y y = Util.someStaticMethod(x);

   //Some more code
}

编辑:我还在某处读到,使用静态方法是一种代码异味,是设计不良的标志。那么我应该如何重构设计以及我将获得哪些优势呢?

【问题讨论】:

  • 您的问题与查询标题有何关系。
  • 嗨,Shail,我刚刚提供了 EDIT :)
  • 在 JDK 中,有几个很好的静态类示例。集合、数组...
  • 我不认为它一定表明设计不好(可能取决于你如何使用它)。它通常是实用程序的首选。 (您可以在 java API 本身中找到许多示例)
  • @Sourabh 如果重构您的代码是不可能的,那么 PowerMock 几乎是您唯一的选择!不要因为它使用自己的跑步者而被推迟,这应该不是问题

标签: java junit mockito static-methods


【解决方案1】:

我应该如何重构设计以及我将获得哪些优势?

好吧,如果你需要mock静态工具方法,那就让它成为一个可注入对象的实例方法,这样你就可以注入这个对象的mock实现了。优点是它使您的代码更具可测试性:

public class Util {
    public Y someInstanceMethod(X x) {
        ...
    }
}

public class ClassToBeTested {
    private Util util;

    public ClassToBeTested(Util util) {
        this.util = util;
    }

    public void doSomething(int x){

        //Some code

        Y y = util.someInstanceMethod(x);

       //Some more code
    }
}

public class ClassToBeTestedTest {

    public void testDoSomething() {
        Util mockUtil = mock(Util.class);
        ClassToBeTested t = new ClassToBeTested(mockUtil);

        when(mockUtil.someInstanceMethd(3)).thenReturn(...);

        ...
    }
}

这是依赖注入的主要卖点:它使您的代码可测试。

【讨论】:

  • 嗨,JB,这是我已经在考虑的事情,但这基本上会过度使用项目中的静态方法。我想我可能会在一些研究后使用 PowerMock,如果它以各种方式遵守项目 TDD 标准并且没有任何其他相关问题。 :) 无论如何感谢您的回复 :)
【解决方案2】:

我使用 jMockit 模拟静态 Util 类。

public class UtilsTest {
    @After
    public void teardown() {
        Mockit.restoreAllOriginalDefinitions();
    }
    @Test
    public void testMyUtil() {
        Mockit.setUpMocks( MockUtil.class );
    }
}

@MockClass(realClass=Util.class)
public class MockUtil{
    @Mock
    public static MySpecialClass someStaticMethod(int x) {
        return Mockito.mock(MySpecialClass.class);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多