Ich habe Probleme, eine verspottete Methode eines Objekts aufzurufen, das von einer anderen verspotteten Methode meines verspotteten Dienstes zurückgegeben wird.NPE beim Aufruf eines verspotteten Objekts (Mockito)
Insbesondere möchte ich das Ergebnis von "builder.get()" verspotten. Aber wenn "builder.get()" aufgerufen wird, erhalte ich eine Nullzeiger-Ausnahme (Builder ist null).
My-Controller wie folgt aussieht:
@RestController
public class MyController {
@Autowired
MyClientService myClientService;
@RequestMapping("/myMethod")
@Validated
public MyCustomResponse myMethod(@RequestParam String someId, @Valid @ModelAttribute("someParams") SomeHeaderParams someHeaderParams) {
final String targetString = myClientService.buildTargetString("resource", someId + "/myMethod");
final Map<String, String> headerMap = myClientService.getHeaderParams(someHeaderParams);
Map<String, String> paramsMap = new HashMap<>();
paramsMap.put("SOME_ID", someId);
Invocation.Builder builder = myClientService.buildRequest(targetString, headerMap, paramsMap);
final Response response = builder.get();
return response.readEntity(MyCustomResponse.class);
}
}
Und mein Test wie folgt aussieht:
@RunWith(MockitoJUnitRunner.class)
public class MyControllerTests {
@Spy
@InjectMocks
MyController myControllerController;
@Mock
MyClientService myClientService;
SomeHeaderParams someHeaderParams;
@Before
public void init() {
someHeaderParams = new SomeHeaderParams();
someHeaderParams.setCommunicationLanguage("de");
someHeaderParams.setCrId("123");
someHeaderParams.setMemberUserId("qwe");
}
@Test
public void myTest() {
MyCustomResponse myResponseMock = mock(MyCustomResponse.class);
Response responseMock = mock(Response.class);
Mockito.when(responseMock.readEntity(MyCustomResponse.class)).thenReturn(myResponseMock);
Invocation.Builder builderMock = mock(Invocation.Builder.class);
Mockito.when(builderMock.get()).thenReturn(responseMock);
Mockito.when(myClientService.buildRequest(Mockito.anyString(), Mockito.anyMap(), Mockito.anyMap())).thenReturn(builderMock);
MyCustomResponse response = myControllerController.myMethod("myBusinessId", someHeaderParams);
}
} Dies sollte nicht allzu schwierig sein, aber ich fand keine Beispiele wo die verspottete Methode einen anderen Mock zurückgab, fand ich nur Beispiele, wo es einen String zurückgibt.
Eine Frage: In Ihrem Test, ist die Linie 'Mockito.when (auskunftClientService. buildRequest (Mockito.anyString(), Mockito.anyMap(), Mockito.anyMap())) thenReturn (builderMock). ' sein soll ' Mockito.when (someService.buildRequest (Mockito.anyString(), M ockito.anyMap(), Mockito.anyMap())). thenReturn (builderMock); ' ? –
yep, änderte es, danke – IwantToKnow
** 1 ** Wo bekommen Sie die NPE? ** 2 ** Ich sehe nirgendwo im Code 'MockitoAnnotations.initMocks (this);' um deine Mocks zu initialisieren; Benutzt du einen anderen Läufer wie [MockitoJUnitRunner] (http://site.mockito.org/mockito/docs/current/org/mockito/runners/MockitoJUnitRunner.html)? ** 3 ** Sie können [einen Schein konfigurieren, um eine ganze Hierarchie von Mocks/Stubs zurückzugeben] (http://site.mockito.org/mockito/docs/current/org/mockito/Answers.html) anstelle von Standardwerten (Null, falsch, 0, usw.). Dies ermöglicht eine Scheinkonfiguration (selbst zwischenzeitliche), wodurch die Notwendigkeit vermieden wird, zwischenzeitliche Mocks selbst zu erstellen. – Morfic