java - 如何在不运行静态方法中的代码的情况下测试静态方法

标签 java unit-testing junit

一段代码是这样的:

public class ClassToTest {
    public static A method1(arguments here){
        //a log of code here
        A a = new A();
        return a;
    }
}

问题是构造函数调用 new A() 在库中,我不希望 method1 在我的测试中调用此构造函数,因为它对于我当前的测试来说不是必需的,并且它包含一些网络连接。我希望我的单元测试摆脱任何外部依赖项。

一般在单元测试中,我们不想对源代码进行任何修改。但为了测试方法1中的关键逻辑,对源代码进行一些合理的更改是可以接受的。

起初我认为我可以将new A()移动到另一个方法并构建一个子类,然后重写该方法。这个改动在不考虑测试的情况下也是合理的,所以我认为是可以接受的。但仅添加用于测试的标志是 Not Acceptable 。

但我不能这样做,因为我需要测试的方法是静态的。

是否有其他方法可以在不运行 A a = new A() 行的情况下测试这段代码?

最佳答案

如果您不希望该方法引入状态,请使用 PowerMockito.mockStatic()模拟返回值。这假设您的静态方法没有副作用,如果没有,您确实应该编写它,这样就不会产生副作用。

@RunWith(PowerMockRunner.class)
public class ClassToTestTest {
    private ClassToTest classMock;
    private ClassToTest testObject;
    @Before
    public void init() {
        testObject = new ClassToTest();
    }

    @Test
    public void example() {
        Object args = new Object();
        PowerMockito.mockStatic(ClassToTest.class);
        doReturn(new A()).when(ClassToTest.class, "method1", args);
   }
}

doReturn 将允许您设置在执行静态方法后最终返回的内容。

关于java - 如何在不运行静态方法中的代码的情况下测试静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549619/

相关文章:

java - 如何强制创建新的http session

java - 如何在java中使用查询结果

java - 如何在 Java 中比较字符串?

php - Symfony 2.6 覆盖 PHPUnit_Framework_Error

ios - 在 Jenkins 上运行 Xcode UI 测试永远不会失败

java - 使用反射消隐字段

java - 从 Google AppEngine 切换到另一台服务器

unit-testing - 使用 Resharper 从单元测试项目中记录 NHibernate 信息

unit-testing - 使用 MOQ 对象进行 ASP.NET MVC 单元测试

java - 如何创建自定义 "ExpectedException"junit 规则?