Вы не можете использовать when
на getMethod, потому что getMethod - это не фальшивка. Это все еще реальный объект, созданный вашим классом.
ArgumentCaptor имеет совершенно другое назначение. Проверьте раздел 15 здесь .
Вы можете сделать свой код более тестируемым. Как правило, классы, создающие новые экземпляры других классов, сложно протестировать. Поместите некоторую фабрику в этот класс для создания методов get / post, затем в тесте смоделируйте эту фабрику и сделайте так, чтобы она имитировала методы get / post.
public class YourClass {
MethodFactory mf;
public YourClass(MethodFactory mf) {
this.mf = mf;
}
public void handleHttpClient(HttpClient httpClient) {
httpClient.executeMethod(mf.createMethod());
//your code here
}
}
Тогда в тесте вы можете сделать:
HttpClient mockHttpClient = mock(HttpClient.class);
when(mockHttpClient.executeMethod(any(GetMethod.class)).thenReturn(HttpStatus.SC_OK);
MethodFactory factory = mock(MethodFactory.class);
GetMethod get = mock(GetMethod.class);
when(factory.createMethod()).thenReturn(get);
when(get.getResponseBodyAsStream()).thenReturn(new FileInputStream(source));
ОБНОВЛЕНИЕ
Вы также можете попробовать какой-нибудь мерзкий взлом, и Answer
и получить доступ к закрытым частям GetMethod;) по рефлексии. (Это действительно противный хак)
when(mockHttpClient.executeMethod(any(GetMethod.class))).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
GetMethod getMethod = (GetMethod) invocation.getArguments()[0];
Field respStream = HttpMethodBase.class.getDeclaredField("responseStream");
respStream.setAccessible(true);
respStream.set(getMethod, new FileInputStream(source));
return HttpStatus.SC_OK;
}
});