如何使用 Mockito 测试不模拟对象的异步方法?
How to test async method from not mocking object with Mockito?
我想用 Mockito 测试下面的代码
@Override
public void getSessionList(final int carId, final ResultCallback<List<Session>> callback) {
jobExecutor.execute(new Runnable() {
@Override
public void run() {
List<SessionEntity> sessions = IDataStore.getSessionList(carId);
final List<Session> sessionList = new ArrayList<>();
if (sessions != null) {
for (SessionEntity entity : sessions) {
sessionList.add(mapper.transform(entity));
}
uiThread.post(new Runnable() {
@Override
public void run() {
if (callback != null) {
callback.onResult(sessionList);
}
}
});
}
}
});
}
我试图做这样的事情,但我的验证方法将比可运行的早执行。
Thread.sleep() 对于前两个验证效果很好,但是如何测试将在主线程中执行的 callback.onResult 的结果?
private Repository repository // not mocked
@Mock
private IDataStore dataStore;
@Mock
private DataToDomainMapper dataToDomainMapper;
@Mock
private ResultCallback resultCallback;
@Test
public void testGetSessionListCallbackSuccess(){
List<SessionEntity> sessionEntities = Arrays.asList(sessionEntity, sessionEntity, sessionEntity);
given(dataStore.getSessionList(anyInt())).willReturn(sessionEntities);
given(dataToDomainMapper.transform(any(SessionEntity.class))).willReturn(session);
repository.getSessionList(1, resultCallback);
verify(dataStore).getSessionList(anyInt());
verify(dataToDomainMapper, times(3)).transform(any(SessionEntity.class));
verify(resultCallback).onResult(any(List.class));
}
我相信你可以将匿名 Runnable 移动到内部(或嵌套)class 并在两部分上进行拆分测试:检查 jobExecutor 是否使用相应的 class 实例开始执行并检查 [=16= inner/nested class 的 ]() 方法如您所愿
查看名为 Awaitility 的用于测试异步方法的工具。非常方便的工具,为我节省了大量测试异步方法的时间。
我想用 Mockito 测试下面的代码
@Override
public void getSessionList(final int carId, final ResultCallback<List<Session>> callback) {
jobExecutor.execute(new Runnable() {
@Override
public void run() {
List<SessionEntity> sessions = IDataStore.getSessionList(carId);
final List<Session> sessionList = new ArrayList<>();
if (sessions != null) {
for (SessionEntity entity : sessions) {
sessionList.add(mapper.transform(entity));
}
uiThread.post(new Runnable() {
@Override
public void run() {
if (callback != null) {
callback.onResult(sessionList);
}
}
});
}
}
});
}
我试图做这样的事情,但我的验证方法将比可运行的早执行。 Thread.sleep() 对于前两个验证效果很好,但是如何测试将在主线程中执行的 callback.onResult 的结果?
private Repository repository // not mocked
@Mock
private IDataStore dataStore;
@Mock
private DataToDomainMapper dataToDomainMapper;
@Mock
private ResultCallback resultCallback;
@Test
public void testGetSessionListCallbackSuccess(){
List<SessionEntity> sessionEntities = Arrays.asList(sessionEntity, sessionEntity, sessionEntity);
given(dataStore.getSessionList(anyInt())).willReturn(sessionEntities);
given(dataToDomainMapper.transform(any(SessionEntity.class))).willReturn(session);
repository.getSessionList(1, resultCallback);
verify(dataStore).getSessionList(anyInt());
verify(dataToDomainMapper, times(3)).transform(any(SessionEntity.class));
verify(resultCallback).onResult(any(List.class));
}
我相信你可以将匿名 Runnable 移动到内部(或嵌套)class 并在两部分上进行拆分测试:检查 jobExecutor 是否使用相应的 class 实例开始执行并检查 [=16= inner/nested class 的 ]() 方法如您所愿
查看名为 Awaitility 的用于测试异步方法的工具。非常方便的工具,为我节省了大量测试异步方法的时间。