У меня проблема с модульным тестированием метода, который по очереди вызывает другого, помеченного @Async, как описано ниже:
Тест:
@RunWith(MockitoJUnitRunner.class)
public class AServiceTest {
@Mock
private BService bService;
@InjectMocks
private AService aService = new AServiceImpl();
@Test
public void do_something() {
given(bService.readStream(any(InputStream.class))).willReturn(2L);
Long result = aService.doSomething();
assertThat(result).isNotNull();
}
}
Служба A:
public class AServiceImpl {
@Autowired
private BService bService;
@Override
public Long doSomething() {
try {
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
Future<Long> result = bService.readStream(pis);
this.writeStream(pos);
pos.flush();
pos.close();
return result.get();
} catch (IOException | InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
}
private void writeStream(PipedOutputStream pos) {
//write on pos
...
}
}
Служба B:
public class BServiceImpl implements BService {
@Async
@Override
public Future<Long> readStream(PipedInputStream pis) {
//read from pis
...
return new AsyncResult<>(1L);
}
}
Затем, когда я запускаю тест, это застревает и никогда не заканчивается.Насколько я понимаю, возможно, это связано с тем, что метод BService был @Async, но моя ставка в том, что проблема связана с тем, что метод Bservice был издевался и неправильно читал PipedInputStream.
I 'Я новичок в модульном тестировании, есть ли правильный способ проверить это?