弹簧控制器测试路径变量给出404



我知道这里有人问过这个问题,但我找不到答案。我有一个接受路径变量的Spring REST控制器端点,但我一直得到404而不是200。

这是我的控制器方法:
@GetMapping("/colorNames/{colorFamily}")
public ResponseEntity<List<ColorNameFamilyDTO>> getColorNamesByColorFamily(@PathVariable String colorFamily)
{
List<ColorNameFamilyDTO> colorInformations = service.getColorNamesByColorFamily(colorFamily.toUpperCase());

return ResponseEntity.ok(colorInformations);
}

,我的测试是:

@RunWith(SpringRunner.class)
@WebMvcTest(InfoController.class)
public class InfoControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private InfoService service;
@Autowired
private ObjectMapper objectMapper;
@Test
public void testGetColorNamesByFamily() throws Exception
{
List<ColorNameFamilyDTO> colorInformations = new ArrayList<>();
Mockito.when(service.getColorNamesByColorFamily(Mockito.anyString()))
.thenReturn(colorInformations);
mockMvc.perform(get("/colorNames/{colorFamily}", "Blue")
.contentType("text/plain")).andExpect(status().isOk());
}
}

我尝试使用param,并直接指定路径中的字符串。出了什么问题?我使用的是SpringBoot 2.1.3.RELEASE.

添加doPrint()在控制台上显示如下:

MockHttpServletRequest:
HTTP Method = GET
Request URI = /colorNames/Blue
Parameters = {}
Headers = [Content-Type:"text/plain"]
Body = <no character encoding set>
Session Attrs = {}
Handler:
Type = com.controller.Controller
Method = public org.springframework.http.ResponseEntity<java.util.List<com.dto.ColorNameFamilyDTO>> com.controller.getColorNamesByColorFamily(java.lang.String)
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 404
Error message = null
Headers = []
Content type = null
Body = 
Forwarded URL = null
Redirected URL = null
Cookies = []

如果没有"/colorNames">,你会得到HTTP 404。因此,请检查控制器。你的控制器类应该标记为@RestController注释。

你可以尝试使用RequestBuilder对象来调用控制器

requestBuilder = MockMvcRequestBuilders.get("/colorNames/{colorFamily}", "Blue")
.contentType(MediaType.TEXT_PLAIN_VALUE)
.accept(MediaType.APPLICATION_JSON_UTF8);
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(print())
.andReturn();

print()会告诉你调用的是哪个API路径

更新:

请检查控制器和测试类

@RestController
public class AddDataController {
@Autowired
public AddDataService addDataService;
@GetMapping(value = "colourNames/{pathVar}")
public ResponseEntity dataAdded(@PathVariable String pathVar){
return addDataService.printPathVariable(pathVar);
}
}

和Test class应该是

@WebMvcTest(AddDataController.class)
@RunWith(SpringRunner.class)
class AddDataControllerTest {
@MockBean
public AddDataService addDataService;
@Autowired
public MockMvc mockMvc;
@BeforeEach
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
void dataAdded() throws Exception {
RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/colourNames/{pathVar}", "Blue")
.contentType(MediaType.TEXT_PLAIN_VALUE);
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andDo(print())
.andReturn();
}
}

你能在这里共享print()响应吗

最新更新