java - Mockito:模拟异步方法

标签 java asynchronous mockito

<分区>

我需要用 JUnit 和 Mockito 测试这个方法

 function uploadData() {
    myObject.getThreadPool().execute(new Runnable() {
                @Override
                public void run() {
                    upload(arguments, callbackContext);
                }
            });
        }

如何在不在后台线程中模拟 myObject 来调用 upload(arguments, callbackContext)?

最佳答案

您需要在这里做一些事情。首先,将 ThreadPool 替换为 mock,这样您就可以访问 mock execute。然后使用 ArgumentCaptora verify call访问 Runnable。最后,触发 Runnable 并测试之后的状态。

@Test public void shouldUploadInBackground() {
  // declare local variables
  MyObject mockMyObject = Mockito.mock(MyObject.class);
  ThreadPool mockThreadPool = Mockito.mock(ThreadPool.class);
  ArgumentCaptor<Runnable> runnableCaptor =
      ArgumentCaptor.forClass(Runnable.class);

  // create the system under test
  when(mockMyObject.getThreadPool()).thenReturn(mockThreadPool);
  SystemUnderTest yourSystemUnderTest = createSystem(mockThreadPool);

  // run the method under test
  yourSystemUnderTest.uploadData();

  // set the runnableCaptor to hold your callback
  verify(mockThreadPool).execute(runnableCaptor.capture());

  // here you can test state BEFORE the callback executes
  assertFalse(yourSystemUnderTest.isDataUploaded());

  // call run on the callback
  runnableCaptor.getValue().run();

  // here you can test state AFTER the callback executes
  assertTrue(yourSystemUnderTest.isDataUploaded());
}

关于java - Mockito:模拟异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18074212/

相关文章:

ssl - 为服务器对象 [Java/Jetty] 设置 SSLParameters 密码顺序

java - 在 LibGDX 中检测圆是否与矩形的上半部分或下半部分相交

java - 使用 Jogl 直接从 volatileImage 创建纹理

javascript - 在异步函数中等待 MySQL 查询?

javascript - 异步请求回调,传递的变量在我不希望它们被覆盖时被覆盖

javascript - TypeError : rl. 问题不是函数 - NodeJS - 使用 play.js

java - 升级到 2.7 ClassNotFoundException : org. mockito.exceptions.Reporter 后运行测试

java - 如何使用 Java 将 .txt 文件转换为 .csv?

java - Mockito 的 doReturn() 方法未在代码中返回所需的值

java - 为什么单元测试中的 'verify' 在不同实例的情况下不会返回 'different arguments' 错误?