Java 如何测试静态方法而不运行其中的一段代码

Java 如何测试静态方法而不运行其中的一段代码,java,unit-testing,junit,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在测试中调用此构造函数,因为它不是当前测试所必需的,并且它包含一些网络连接。我希望我的单元测试摆脱任何外部依赖 通常

一段代码如下所示:

public class ClassToTest {
    public static A method1(arguments here){
        //a log of code here
        A a = new A();
        return a;
    }
}
问题是构造函数调用
new A()
在库中,我不希望method1在测试中调用此构造函数,因为它不是当前测试所必需的,并且它包含一些网络连接。我希望我的单元测试摆脱任何外部依赖

通常在单元测试中,我们不想对源代码做任何修改。但是为了测试method1中的关键逻辑,可以对源代码进行一些合理的更改

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

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


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

如果不希望该方法引入状态,则使用模拟返回值。这就假设你的静态方法没有副作用,如果没有副作用,你真的应该编写它,这样它就没有副作用了

@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
将允许您设置在执行静态方法后最终返回的内容。

如果您不希望该方法引入状态,请使用模拟返回值。这就假设你的静态方法没有副作用,如果没有副作用,你真的应该编写它,这样它就没有副作用了

@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
将允许您设置在执行静态方法后最终返回的内容。

如果您不希望该方法引入状态,请使用模拟返回值。这就假设你的静态方法没有副作用,如果没有副作用,你真的应该编写它,这样它就没有副作用了

@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
将允许您设置在执行静态方法后最终返回的内容。

如果您不希望该方法引入状态,请使用模拟返回值。这就假设你的静态方法没有副作用,如果没有副作用,你真的应该编写它,这样它就没有副作用了

@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
将允许您设置在执行静态方法后最终返回的内容。

这就是模拟静态方法的方式,对吗?但我想测试的逻辑是method1。我想模拟的是新的A()而不是method1。这就是模拟静态方法的方式,对吗?但我想测试的逻辑是method1。我想模拟的是新的A()而不是method1。这就是模拟静态方法的方式,对吗?但我想测试的逻辑是method1。我想模拟的是新的A()而不是method1。这就是模拟静态方法的方式,对吗?但我想测试的逻辑是method1。我想嘲弄的是新的A()而不是方法1。我回答了一个问题,问的问题非常类似。我建议了3种解决方案,所有这些方案都适用于您:对于第一种解决方案(模拟工厂),您可以通过将静态调用包装在具体的类实现中来实现相同的功能为什么不提取出一个包含您想要测试的逻辑的方法或类,并对其进行测试?那么这意味着测试通过一次,它将永远过去@NamshubWriter@StarPinkER您希望什么样的更改导致测试失败?我回答了一个类似的问题。我建议了3种解决方案,所有这些方案都适用于您:对于第一种解决方案(模拟工厂),您可以通过将静态调用包装在具体的类实现中来实现相同的功能为什么不提取出一个包含您想要测试的逻辑的方法或类,并对其进行测试?那么这意味着测试通过一次,它将永远过去@NamshubWriter@StarPinkER您希望什么样的更改导致测试失败?我回答了一个类似的问题。我建议了3种解决方案,所有这些方案都适用于您:对于第一种解决方案(模拟工厂),您可以通过将静态调用包装在具体的类实现中来实现相同的功能为什么不提取出一个包含您想要测试的逻辑的方法或类,并对其进行测试?那么这意味着测试通过一次,它将永远过去@NamshubWriter@StarPinkER您希望什么样的更改导致测试失败?我回答了一个类似的问题。我建议了3种解决方案,所有这些方案都适用于您:对于第一种解决方案(模拟工厂),您可以通过将静态调用包装在具体的类实现中来实现相同的功能为什么不提取出一个包含您想要测试的逻辑的方法或类,并对其进行测试?那么这意味着测试通过一次,它将永远过去@NamshubWriter@StarPinkER您希望什么样的更改导致测试失败?