3

このメソッドを JUnit と Mockito でテストする必要があります

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

myObject をモックして、バックグラウンド スレッドではなく upload(arguments, callbackContext) を呼び出す方法は?

4

2 に答える 2

2

ここでいくつかのことを行う必要があります。まず、 をモックに置き換えてThreadPool、モックにアクセスできるようにexecuteします。次に呼び出しArgumentCaptorで を使用して にアクセスします。最後に、 をトリガーし、後で状態をテストします。verifyRunnableRunnable

@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());
}
于 2013-08-06T18:30:05.283 に答える
0

私は次のことがうまくいくと思います:

Mockito.doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        upload(arguments, callbackContext);
    }).when(myObjectSpy.getThreadPool()).execute(Mockito.any(Runnable.class));

しかし、私はよくわかりません。

于 2013-08-06T07:53:07.153 に答える