java - 'correct' 测试 JUnit 测试无法直接看到的 Runnables 的方法是什么?

标签 java multithreading unit-testing junit

我要创建一系列测试,其中一些测试导致部分工作在单独的线程中完成。因为这项工作发生在另一个线程中,并且它不接受任何对象作为参数,所以 JUnit/Mockito 无法看到线程内发生的情况。这意味着如果代码以某种方式失败,那么 JUnit 将看不到抛出的异常,这意味着它将假设测试期间没有抛出异常,并且可能在不应该抛出异常时“通过”它。

所讨论的可运行对象并不直接与启动它的线程进行通信,因此目前我一直在创建测试,这些测试只是寻找线程对其所处理的其他文件产生的外部印象,调用数据库,等等

这是一种合理的测试方法吗?这是否存在听起来我没有考虑过的问题?我是否应该模拟创建此可运行程序的部分,然后自行测试该可运行程序?或者我应该采取其他更好的路径吗?

<小时/>

注意:不幸的是,我无法对我正在测试的代码进行任何修改。

最佳答案

如果不确切知道可运行对象中发生了什么以及是否可以重构它们,就很难提供更多帮助。

也许您可以将监听器传递到可运行对象中以使其更具可测试性。

public interface Listener {
   void onSuccess(Object context);
   void onError(Object context, Throwable t);
}

public class MyRunnable implements Runnable {
    private Listener listener;
    /// constructor;
    public void run() {
       Object context = ...;
       try {
          doStuff(context);
          listener.onSuccess(context);
       } catch (Throwable t) {
          listener.onError(context, t);
       }
    }
}

如果您无法重构可运行程序,那么您唯一可以测试的就是外部影响。如果这是一个单元测试并且您已经实现了 IOC,您可以模拟服务依赖项并测试服务调用(例如使用 Mockito)。

关于java - 'correct' 测试 JUnit 测试无法直接看到的 Runnables 的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778485/

相关文章:

scala - 无法加载套件类

php - 如何在 PHPUnit 中模拟 MongoClient

oop - 通过其他测试类对类进行单元测试

java - Android - 写入 ISO15693 标签

c++ - 这是 C++ 条件变量中的错误吗?

java - 二维数组中静态一维数组的问题

c++ - 死锁C++线程条件变量

Java:线程等待对象时是否释放所有监视器?

java - 将用户输入的字符拆分为 ArrayList

java - libgdx 文本动画(一个字母一个字母)