我正在尝试测试一个 Spring 控制器方法 - 该方法位于帖子末尾,测试类位于该值下方。我已经把它剥离了一点,试图缩小问题的范围。
当我按原样运行测试时,它失败了:
java.lang.AssertionError: Status
Expected :200
Actual :404
如果我按如下方式编辑 mockMvc.perform,那么测试就通过了,我什至不必将控制器中的@PathVariables更改为 Longs:
mockMvc.perform(get(ApplicationEndPoints.GET_CCS_NAME_AND_ADDRESS_AJAX, 1L, 2L))
.andExpect(status().isOk());
控制器方法本身工作正常,并按预期返回 JSON。我可以只使用这些 Long 值并期望测试正常,或者如何让它与字符串一起使用吗?
我应该补充一点,我是一个完全测试的菜鸟。谢谢!
控制器方法:
@PreAuthorize("hasAuthority('auditor')")
@RequestMapping(value = ApplicationEndPoints.GET_APPLICANT_DATA, method = RequestMethod.GET)
@ResponseBody
public ApplicantData getNameAndAddress(@PathVariable("businessId") String businessId, @PathVariable("date") String date) {
//Date d = Date.valueOf(date);
ApplicantParams params = new ApplicantParams();
//params.setBusinessId(businessId);
//params.setApplicationReceivedDate(d);
params.setRoleId(ADDRESS_ROLE.HR.getRoleId());
return applicantService.getApplicantData(params);
}
测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationTestConfig.class})
@WebAppConfiguration
public class ClientDetailAjaxControllerTest {
@InjectMocks
private ClientDetailAjaxController clientDetailAjaxController;
private MockMvc mockMvc;
private ApplicantServiceInterface<Applicant> applicantService = Mockito.mock(ApplicantServiceImpl.class, Mockito.RETURNS_DEEP_STUBS);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(clientDetailAjaxController).build();
}
@Test
public void getNameAndAddress() throws Exception {
Mockito.when(applicantService.getApplicantData(Mockito.any(ApplicantParams.class)))
.thenReturn(ApplicationTestData.getApplicantData());
mockMvc.perform(get(ApplicationEndPoints.GET_APPLICANT_DATA, Mockito.anyString(), Mockito.anyString()))
.andExpect(status().isOk());
Mockito.verify(applicantService, Mockito.times(1)).getApplicantData(Mockito.any(ApplicantParams.class));
Mockito.verifyNoMoreInteractions(applicantService);
}
}
编辑:我已经澄清了一两件事来回应评论......
> 404 告诉您 mockMVC 无法与您尝试调用的控制器方法匹配。
我注意到在您的控制器中,路径是ApplicationEndPoints.GET_APPLICANT_DATA
的,而在测试中,您已经显示路径是ApplicationEndPoints.GET_CCS_NAME_AND_ADDRESS_AJAX
。
尽管如此 - 不要使用 Mockito.anyString()
代替您必须在 mockMVC perform
方法中提供给RequestBuilder
的参数值。
下面是代码应该是什么样子的想法(从您的示例中派生(:
要测试此控制器方法,请执行以下操作:
@RequestMapping(value = "/applicant/name-and-address/", method = RequestMethod.GET)
public ApplicantData getNameAndAddress(@PathVariable("businessId") String businessId, @PathVariable("date") String date) {
// some code
}
您需要执行以下操作:
mockMvc.perform(get("/applicant/name-and-address/{businessId}/{date}", "myBusinessId", "myDateAsString")).andExpect(status().isOk());
不同之处在于你必须传递实际的字符串值,而不是 Mockito.anyString((。
其他一些注意事项:
如果 URL 路径变量与要绑定到的参数同名,则可以编写
@PathVariable String id
,而不是@PathVariable("id") String id
。您可以使用
@GetMapping
代替@RequestMapping
GET
方法,@PostMapping
POST
等。