У меня есть класс, который я хочу протестировать с помощью mockito. Лучший способ описать класс - вставить код, но я постараюсь сделать все возможное в короткой фразе.Mock Asynchronous Call from void class
Класс имеет одну функцию void и вызывает другой объект, который передается через методы setter и getter. Объект, который вызывается (из функции void), является асинхронным вызовом.
Проблема, с которой я столкнулся, заключается в издевательском асинхронном вызове, который использует функция void (тестирование через junit).
pubic class Tester {
private Auth auth; // not mock'ed or spy'ed
@Mock private Http transport;
@Before
....
@Test
public void testVoidFunctionFromAuth() {
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return doOutput();
}
}).when(transport).executeAsync(param1, param2, param3...);
auth.obtainAuth(); // void function that uses transport mock class
// obtainAuth calls transport.executeAsync()
// as part of the code
}
// return type of transport.executeAsync() is
// ListenableFuture<ResponseEntity<String>>
private ListenableFuture<ResponseEntity<String>> doOutput() {
return new SimpleAsyncTaskExecutor()
.submitListenable(new Callable<ResponseEntity<String>>() {
@Override
public ResponseEntity<String> call() throws Exception {
....
return responseEntity
}
});
}
}
Что происходит, что функция doOutput()
вызывается перед темauth.obtainAuth();
и когда obtainAuth()
пытается вызвать doOutput()
возвращает null
- скорее всего потому, что doOutput
уже выполнить на линии раньше. Я не уверен, как связать/вставить класс mock'ed (транспорт) по вызову executeAsync
.
Как правило, только макетный объект возвращает значение мгновенно, при необходимости завернутое в будущее. – chrylis
@chrylis ya, который обычно работает, но мы хотим, чтобы объект mock'ed, '' 'Auth''' фактически не использовался (делает HTTP-запрос). Помимо объема тестирования. – Adam
Вот почему вы используете макет; вы фактически не загружаете объект, который делает запросы. Похоже, вы не совсем поняли, что такое макет. – chrylis