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