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

2024-04-05

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

系统退出类:

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 http://code.google.com/p/powermock/wiki/MockitoUsage13将 Jas 放入您的项目中,而不仅仅是普通的 Mockito。 Powermock 库设计用于模拟静态和/或最终类和方法。

下列这篇博文 http://loongest.com/powermock/mock-static-void-method/包含描述与您类似的场景的示例代码。

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

@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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • C#4 动态关键字 - 为什么不呢?

    看了很多回复后这个线程 https stackoverflow com questions 244302 what do you think of the new c 40 dynamic keyword 我看到许多不喜欢它的人都提到了滥用
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • Spring AOP 日志拦截器和 JAXB 问题

    我正在尝试将日志记录方面实现到我的应用程序中 这是我第一次尝试 AOP 所以如果我遗漏了一些明显的东西 请告诉我 为了实现编织外部 jar 我正在尝试实现加载时间编织器 我确实在应用程序上下文中指定了加载时编织器 并在 context xm
  • PHP Mysqli 语句返回单行,-1 行受影响,并且没有错误

    这太令人困惑了 我一定错过了一些简单的东西 我有一个查询 检查我插入的事务是否已经存在 以防止重复 这是代码 function isaDupe portableDB transactArray ref transactArray refer
  • 如何使用 UISwipeGestureRecognizer 将“点击”传递给 UIView 下方的 UIButton?

    我在 透明 UIView 下方有一个 UIButton 上面的 UIView 添加了一个 UISwipeGestureRecognizer 这是它的唯一目的 检测某些滑动手势 我希望该 UIView 忽略所有其他触摸 并传递给其他视图 例如
  • 当文本字段开始编辑 iPhone 时表视图滚动

    我在 iPhone 应用程序中有表视图控制器 表视图有两个部分 第一部分有两行 第二部分有一行 第二部分有一个自定义表格视图单元格 第二部分有一个文本字段 当文本字段开始编辑并且键盘弹出时 该文本字段会隐藏 我希望这个表格视图在键盘弹出时滚
  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 将坐标(地理位置)存储在数组中以计算距离

    我和我的搭档正在为我们的学校论文开发一个练习网络应用程序 我们正在尝试使用地理定位 API 的 watchposition 函数获取跑步者的位置并在锻炼期间跟踪他 跑步者可以在屏幕上查看他当前的距离 这是我们被卡住的点 我们只能计算起点和终
  • 在 Kafka 生产者上启用幂等性是否会降低吞吐量

    我有卡夫卡制作人启用幂等性 没有启用一次语义或事务 在休息端点调用中 我启用它的原因是因为我不希望卡夫卡重试导致任何重复 我担心以下几点 幂等性会减慢我的端点速度吗 这个端点需要非常快 我读了 kafka api 文档 启用幂等性将使重试无
  • 屏幕顶部的自定义 Toast

    请先阅读问题 然后再使用打印 Toast 的标准例程进行回答 我想在屏幕的左上角显示一个自定义 Toast 我使用以下代码来创建 Toast Toast mFixedToast new Toast getApplicationContext
  • PHP 脚本版本检查/通知

    如何根据在线文件检查脚本的版本以查看它是否是最新版本 为了澄清起见 我说的是我编写的脚本 而不是 PHP 的版本 我想采用一种方式让最终用户知道我何时更新了脚本 指定第二个 更简单 解决方案phjr https stackoverflow
  • Java动态澄清

    我在术语下看到了这段摘录Java 流行语在读一本关于Java的书时我不明白 Dynamic Java 程序带有大量的运行时类型信息 用于在运行时验证和解析对对象的访问 这使得以安全且方便的方式动态链接代码成为可能 这对于 Java 环境的稳
  • 每个页面有一个 CSS 文件还是单独的 CSS 文件?

    当我构建页面时 我想要为每个页面使用单独的样式表还是为整个网站使用一个大型样式表 出于加载目的 单个文件不是更好的做法吗 因为加载时的总 CSS 会更少 使用单个文件 CSS 文件会被缓存 因此减少了为每个访问的新页面下载新文件的需要 为了
  • CIDetector跟踪ID从不存在

    我正在 OSX Mavericks 上编写一些人脸检测代码 并尝试利用 CIDetector 提供的跨多个静止图像功能的新 截至 10 8 人脸跟踪 我的基本面部检测工作正常 如下所示 void captureOutput AVCaptur
  • 如何在面板数据中为不同年份创建单独的直方图?

    我有一个数据框报纸 年 其中包含每年一组报纸的发行量 CIRC 我想看看这些数字的分布如何随时间变化 所以我想为这些不同的年份创建多个单独的直方图 我已经尝试过以下方法 ggplot newspaper yearly aes x CIRC
  • YouTube URL 方案 tvOS

    我正在尝试使用 URL 方案或 YouTube com 域从我的应用程序打开 YouTube 的应用程序 从而直接在 iOS 设备上打开 YouTube 的应用程序 这是我尝试过的代码 UIApplication sharedApplica
  • 如何访问shinyapps.io上应用程序的R+Shiny代码?

    我发现了一个设计非常好的闪亮应用程序闪亮应用程序io https wuli shinyapps io QuoiR 网站 但我不知道如何访问它R代码或说出github其代码目录 我发现如果我们能够访问它的代码 这非常有启发性 无论如何 在最坏
  • SQLAlchemy 布尔值与 BOOLEAN 的比较

    我理解了BOOLEAN覆盖 visit name class BOOLEAN Boolean visit name BOOLEAN 控制调度程序选择的访问者方法 def compiler dispatch self visitor kw v
  • Java 编写单元测试,用于当用户在控制台中键入 quit 时退出程序

    我发现很难为这种方法编写单元测试 当用户键入退出命令时 它基本上会退出程序 系统退出类 public class SystemExit public void exit int status System exit status 我的静态方