gpt4 book ai didi

当用户在控制台中键入 quit 时用于退出程序的 Java 编写单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:45 25 4
gpt4 key购买 nike

我发现很难为这个方法编写单元测试,它基本上是在用户键入退出命令时退出程序。

系统退出类:

public class SystemExit {
public void exit(int status) {
System.exit(status);
}
}

我的静态方法:

public static void exitWhenQuitDetected() {
final SystemExit systemExit = new SystemExit();
final String QUIT = "quit";
String line = "";
try {
final InputStreamReader input = new InputStreamReader(System.in);
final BufferedReader in = new BufferedReader(input);
while (!(line.equals(QUIT))) {
line = in.readLine();
if (line.equals(QUIT)) {
System.out.println("You are now quiting the program");
systemExit.exit(1);
}
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}

这里有些地方不太对劲,因为我正在努力对方法 exitWhenQuitDetected 进行单元测试(我正在使用 Mockito 进行模拟)。我将如何模拟 InputStreamReader 并验证 SystemExit.exit 方法在看到退出时被调用?你能解释一下吗?谢谢。

添加了我目前正在进行的测试,它不起作用。

    @Test
@Ignore
public void shouldExitProgramWhenTypeQuit() {
String quit = "quit";
SystemExit systemExit = mock(SystemExit.class);
try {
BufferedReader bufferedReader = mock(BufferedReader.class);
when(bufferedReader.readLine()).thenReturn(quit + "\n");
SomeClass.exitWhenQuitDetected();
verify(systemExit, times(1)).exit(1);
} catch (IOException e) {
e.printStackTrace();
}
}

最佳答案

您应该包括 PowerMockito Jars 到你的项目中,而不仅仅是 Vanilla Mockito。 Powermock 库专为模拟静态和/或最终类和方法而设计。

以下this blog post包含描述与您的场景类似的场景的示例代码。

本质上,您需要一个与此类似的测试类...

@RunWith(PowerMockRunner.class)
@PrepareForTest({System.class, ClassToTest.class})
public class SystemExitTest {

@Test
public void shouldCallSystemExit() {

PowerMockito.mockStatic(System.class);

ClassToTest.methodToTest();

PowerMockito.verifyStatic();

System.exit(0);

System.out.println("If this message displays them System.exit() was mocked successfully");
}
}

给定这个简单的实现类...

public class ClassToTest {

public static void methodToTest() {
// do some stuff
System.exit(0);
}
}

关于当用户在控制台中键入 quit 时用于退出程序的 Java 编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12234526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com