Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在测试的类内powermock静态方法_Java_Unit Testing_Powermockito - Fatal编程技术网

Java 正在测试的类内powermock静态方法

Java 正在测试的类内powermock静态方法,java,unit-testing,powermockito,Java,Unit Testing,Powermockito,我目前正在为我们的退出代码管理器实现一个单元测试,该测试是使用静态方法实现的。我遇到的问题是如何模拟调用System.exit()方法的executeExit,使其不会终止所有测试 我尝试监视SampleClass,但是每当我运行测试时,它仍然会继续退出程序。我尝试的另一个解决方案是模拟整个类,并对测试中的方法使用docallreal方法。然而,这个解决方案是错误的,因为(1)被测试的类没有进行代码覆盖,(2)它以某种方式测试模拟类而不是被测试的真实类。我还试图模仿System.class,但它

我目前正在为我们的退出代码管理器实现一个单元测试,该测试是使用静态方法实现的。我遇到的问题是如何模拟调用System.exit()方法的executeExit,使其不会终止所有测试

我尝试监视SampleClass,但是每当我运行测试时,它仍然会继续退出程序。我尝试的另一个解决方案是模拟整个类,并对测试中的方法使用docallreal方法。然而,这个解决方案是错误的,因为(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();
    }
}

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

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>

静态方法访问使您的代码(使用此静态方法)不灵活。写测试的困难就是一个明显的标志。使用PowerMock是对糟糕设计的屈服。在这里检查这个答案。下面是一个如何模拟静态方法的示例。此外,您甚至可以模拟System.exit,或者更好地说:您可以验证它。第二种解决方案是我更喜欢的方式,但代码覆盖率存在一些问题。这将导致0%的行覆盖率。PowerMock禁用EclEmma代码覆盖率。而且在IDE中没有覆盖代码的变通方法。但是您可以使用JaCoCo离线检测来获得代码覆盖率。感谢您投票/接受答案:)是的,我们正在使用EclEmma代码覆盖率。我将尝试使用其他代码覆盖率库进行检查。非常感谢你。
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();

    }
}