java - jUnit 中 void 方法和线程的单元测试

标签 java unit-testing testing junit

我是单元测试的新手。我明白了它的原理,但我仍然不知道如何测试我当前的项目。我需要测试 void 方法,使用 java.nio.SocketChannel 操作。这些方法是:
- initSelector,我在其中打开选择器,绑定(bind)新的 ServerSocketChannel 并注册它
- 读取,它读取数据并将其放入队列(我是否应该编写额外的方法来验证该数据是否确实存在于队列中?在这种情况下,我应该为该方法编写测试吗?)
- write 方法,它从队列中获取数据并将其写入 SocketChannel

我可以测试这个方法不抛出 IOException,但还有什么?
我应该如何测试线程的run()方法?还是不是单元测试,而是系统测试还是其他?

最佳答案

基本上,您有两种可能性:

  • 如果你想对这些方法进行彻底的单元测试,你应该隐藏具体的(依赖于硬件的组件,如套接字等。在mockable接口(interface)后面,并在单元测试中使用模拟来验证具有预期参数的预期调用是否正确制作这些元素
  • 或者您可以使用整个组件/应用程序中的真实套接字编写集成/系统测试,以验证是否打开了正确的套接字、数据是否正确传输等。

理想情况下,您应该两者都做,但在现实世界中,单元测试可能并不总是可行的。特别是对于这种依赖于某些外部软件/硬件组件(如套接字、数据库、文件系统等)的低级方法。最好的方法是在这些方法/层中留下尽可能少的逻辑(因此失败的可能性很小)可能,并将逻辑抽象到更高层,设计为可单元测试(使用如上所述的可模拟接口(interface))。

要测试线程,您可以像往常一样从单元测试中run()它们。那么很可能您需要等待一段时间才能尝试获取和验证线程产生的结果。

同样,如果您将任务的实际逻辑抽象为例如一个CallableRunnable ,您可以更轻松地单独对其进行单元测试。这也使您能够使用 Executor framework (现在或以后),这使得处理并发变得更加容易和安全。

关于java - jUnit 中 void 方法和线程的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10104205/

相关文章:

unit-testing - 如何在Testcomplete中同时记录Script和keywordTest?

java - 在 Java 中将像素数组转换为图像时数组索引超出范围

java - Android 仅从纵向布局文件夹中获取 xml

unit-testing - Grails Spock 模拟对象

python - 如何从笔记本或 databricks 上的命令行运行 pytest?

java - 一个junit测试用例运行后,是否应该删除与这个测试用例相关的测试数据?

java - 给定两个字符串,递归地确定 1 是否是另一个的子字符串

java - 将 Oracle 或 Sql Server DDL 转换为 Derby

c# - 如何对采用对象数组并在 ASP.Net MVC 中返回 JsonResult 的 Action 方法进行单元测试

angularjs - Protractor - 描述未定义