被测试类中的PowerMocking静态方法

时间:2017-05-30 10:45:29

标签: java unit-testing powermockito

我目前正在为使用静态方法实现的Exit Code Manager实现单元测试。我遇到的问题是如何模拟 executeExit ,它调用 System.exit()方法,以便它不会终止所有测试。

我试图监视 SampleClass 但是每当我运行测试时它仍然会继续退出程序。我尝试的另一个解决方案是模拟整个类,并使用 doCallRealMethod 作为测试方法。但是,这个解决方案有问题,因为(1)测试中的类没有进行代码覆盖,(2)它以某种方式测试模拟类而不是测试中的真实类。我也尝试过模拟 System.class ,但它也无效。

非常感谢各种帮助。谢谢!

下面是一个与我们的方法结构类似的示例代码。

public class SampleClass{

    public static void methodA(){
        //do something here
        executeExit();

    public static void executeExit(){
        //doing some stuff
        System.exit(exitCode);
    }
}

以下是我如何运行测试的示例代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest(SampleClass)
public class SampleClassTest {

    @Test
    public void testMethodA(){
        PowerMockito.spy(SampleClass.class);
        PowerMockito.doNothing().when(SampleClass.class,"executeExit");

        SampleClass.methodA();
    }
}

1 个答案:

答案 0 :(得分:1)

我会像这样测试你的代码:

import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.ExpectedSystemExit;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class SampleClassTest {

    @Rule
    ExpectedSystemExit exit = ExpectedSystemExit.none();

    @Test
    public void testMethodA() {

        exit.expectSystemExitWithStatus(-1);
        SampleClass.methodA();
    }
}

您需要以下依赖

<dependency>
    <groupId>com.github.stefanbirkner</groupId>
    <artifactId>system-rules</artifactId>
    <version>1.16.1</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit-dep</artifactId>
        </exclusion>
    </exclusions>
</dependency>

或者,如果您不想导入该依赖项,则可以执行以下操作:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ SampleClass.class })
public class SampleClassTest {


    @Test
    public void testMethodA() {

        PowerMockito.spy(SampleClass.class);
        PowerMockito.doNothing().when(SampleClass.class);
        SampleClass.executeExit();

        SampleClass.methodA();

        PowerMockito.verifyStatic();
        SampleClass.executeExit();

    }
}