静态方法是一种代码气味



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

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

public void doSomething(int x){
    //Some code
    Y y = Util.someStaticMethod(x);
   //Some more code
}

编辑:另外,我在某处读到使用静态方法是一种代码气味,是糟糕设计的标志。那么,我应该如何重构设计?重构后我将获得哪些优势?

我应该如何重构设计?我将因此获得什么优势?

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

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

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

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

最新更新