静态方法有点代码味吗?

时间:2014-06-12 05:53:53

标签: java junit mockito static-methods

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

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

public void doSomething(int x){

    //Some code

    Y y = Util.someStaticMethod(x);

   //Some more code
}
编辑:我也读过一些地方,使用静态方法是一种代码气味,是设计糟糕的标志。那么我应该如何重构设计以及我将获得哪些优势呢?

2 个答案:

答案 0 :(得分:5)

  

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

好吧,如果你需要模拟静态实用程序方法,那么使它成为一个可注入对象的实例方法,这样你就可以注入这个对象的模拟实现。优点是它使您的代码更易于测试:

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

        ...
    }
}

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

答案 1 :(得分:0)

我使用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);
    }
}