我目前正在为使用静态方法实现的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();
}
}
答案 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();
}
}