【发布时间】:2016-11-05 19:22:08
【问题描述】:
我在调用由我的模拟服务的另一个模拟方法返回的对象的模拟方法时遇到问题。
我特别想模拟“builder.get()”的结果。但是当调用“builder.get()”时,我得到了一个空指针异常(builder 为空)。
我的控制器看起来像:
@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);
}
}
我的测试看起来像:
@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);
}
} 这应该不会太难,但我没有找到任何模拟方法返回另一个 Mock 的示例,我只找到了它返回字符串的示例。
【问题讨论】:
-
一个问题:在你的测试中,
Mockito.when(auskunftClientService.buildRequest(Mockito.anyString(), Mockito.anyMap(), Mockito.anyMap())).thenReturn(builderMock);应该是Mockito.when(someService.buildRequest(Mockito.anyString(), Mockito.anyMap(), Mockito.anyMap())).thenReturn(builderMock);吗? -
好的,改了,谢谢
-
1 您从哪里获得 NPE? 2 我在代码
MockitoAnnotations.initMocks(this);中看不到任何地方来初始化你的模拟;您是否使用其他跑步者,例如MockitoJUnitRunner? 3 您可以使用configure a mock to return a whole hierarchy of mocks/stubs 代替默认值(null、false、0 等)。这允许模拟配置(甚至是中间配置)绕过自己创建中间模拟的需要 -
您现在可以看到带有我使用的注释的完整类。