Модульное тестирование потокового метода с пружинной загрузкой - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблема с модульным тестированием метода, который по очереди вызывает другого, помеченного @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 'Я новичок в модульном тестировании, есть ли правильный способ проверить это?

...