Я пытаюсь создать несколько модульных тестов в Mockito и высмеивать вызов WebServiceTemplate, который возвращает JAXBElement.Я постоянно сталкиваюсь с NullPointerException, а также с внутренними ошибками Mockito.Как успешно смоделировать вызов метода в Mockito?
Я исследовал несколько других проблем в StackOverflow, и хотя некоторые из проблем схожи, ни одна из них не обеспечила успешный макет и тестирование.Мои тесты продолжают проваливаться.
Вот вызов метода в моем реальном коде в классе SearchInvoker.class.
JAXBElement<SearchResponse> response = null;
JAXBElement<SearchRequest> req = soapClient.genConn(searchReq);
try {
response = (JAXBElement<SearchResponse>) getWebServiceTemplate().marshalSendAndReceive(req, new SoapActionCallback("search"));
} catch (RuntimeException e) {
throw new Exception(e);
}
Вот как я пытаюсь смоделировать вызов.
public class SearchInvokerTest extends PackageTest{
@InjectMocks private SearchInvoker invoker;
@Mock private SearchSoapClient soapClient;
@Mock private WebServiceOperations template;
@Test
public void searchInvokerTest() throws Exception {
ObjectFactory factory = new ObjectFactory();
doReturn(factory.createSearchResponse(generateAwsSearchRsp())).when(template.marshalSendAndReceive(any(JAXBElement.class), any(WebServiceMessageCallback.class)));
SearchResponse rsp = invoker.doSearch(new SearchRequestDVO());
assertNotNull(rsp);
assertEquals("123", rsp.getTraceID());
}
}
Там, где у меня есть операторы «когда» и «doReturn», у меня есть NullPointer, а также внутренние ошибки от Mockito.Я ожидаю, что смоделированный класс сможет быть возвращен.
Вот трассировка стека ошибки при запуске mvn test:
[ERROR] Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.018 s <<< FAILURE! - in SearchInvokerTest
[ERROR] searchInvokerTest(SearchInvokerTest) Time elapsed: 0.002 s <<< ERROR!
java.lang.NullPointerException
at SearchInvokerTest.searchInvokerTest(SearchInvokerTest.java:33)
[ERROR] searchInvokerTest(SearchInvokerTest) Time elapsed: 0.017 s <<< ERROR!
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:
-> at SearchInvokerTest.searchInvokerTest(SymcorSearchInvokerTest.java:33)
-> at SearchInvokerTest.searchInvokerTest(SymcorSearchInvokerTest.java:33)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
This message may appear after an NullPointerException if the last matcher is returning an object
like any() but the stubbed method signature expect a primitive argument, in this case,
use primitive alternatives.
when(mock.get(any())); // bad use, will raise NPE
when(mock.get(anyInt())); // correct usage use
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.