当前位置: 首页 > 知识库问答 >
问题:

MockMvc返回404

堵泽宇
2023-03-14

我编写了controller,它为每个映射使用了不同的值。现在我将它简化为对所有映射使用相同的值,但是我不知道如何使test工作,因为它在每个映射上都返回404。

这里是我的控制器:

@CrossOrigin(origins = "*")
@RestController
@RequestMapping("/v1")
public class TaskController {

    @Autowired
    DbService dbService;
    @Autowired
    TaskMapper taskMapper;

    @GetMapping(value = "/tasks")
    public List<TaskDto> getTasks() {
        return taskMapper.mapToTaskDtoList(dbService.getAllTask());
    }

    @GetMapping(value = "/tasks/{id}")
    public TaskDto getTask(@PathVariable Long id) throws TaskNotFoundException {
        return taskMapper.mapToTaskDto(dbService.getTask(id).orElseThrow(TaskNotFoundException::new));
    }

    @DeleteMapping(value = "/tasks/{id}")
    public void deleteTask(@PathVariable Long id) {
        dbService.deleteTask(id);
    }

    @PutMapping(value = "/tasks")
    public TaskDto updateTask(@RequestBody TaskDto taskDto) {
        return taskMapper.mapToTaskDto(dbService.saveTask(taskMapper.mapToTask(taskDto)));
    }

    @PostMapping(value = "/tasks", consumes = APPLICATION_JSON_VALUE)
    public void createTask(@RequestBody TaskDto taskDto) {
        dbService.saveTask(taskMapper.mapToTask(taskDto));
    }
}

和我的测试:

@RunWith(SpringRunner.class)
@WebMvcTest(TaskController.class)
public class TaskControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private DbService dbService;

    @MockBean
    private TaskMapper taskMapper;

    @Test
    public void shouldFetchAllTasks() throws Exception {
        //Given
        List<TaskDto> tasks = new ArrayList<>();
        tasks.add(new TaskDto(1L, "test", "testing"));
        tasks.add(new TaskDto(2L, "test2", "still_testing"));

        when(taskMapper.mapToTaskDtoList(dbService.getAllTask())).thenReturn(tasks);
        //When & Then
        mockMvc.perform(get("/v1/task/tasks").contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(2)))
                .andExpect(jsonPath("$[0].id", is(1)))
                .andExpect(jsonPath("$[0].title", is("test")))
                .andExpect(jsonPath("$[0].content", is("testing")))
                .andExpect(jsonPath("$[1].id", is(2)))
                .andExpect(jsonPath("$[1].title", is("test2")))
                .andExpect(jsonPath("$[1].content", is("still_testing")));
    }

    @Test
    public void shouldFetchGivenTask() throws Exception {
        //Given
        List<TaskDto> tasks = new ArrayList<>();
        tasks.add(new TaskDto(1L, "test", "testing"));
        tasks.add(new TaskDto(2L, "test2", "still_testing"));

        when(dbService.getTask(anyLong())).thenReturn(Optional.of(new Task(2L, "test2", "still_testing")));
        when(taskMapper.mapToTaskDto(anyObject())).thenReturn(tasks.get(1));
        //When & Then
        mockMvc.perform(get("/v1/task/tasks/{id}", "2")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id", is(2)))
                .andExpect(jsonPath("$.title", is("test2")))
                .andExpect(jsonPath("$.content", is("still_testing")));
    }

    @Test
    public void shouldUpdateTask() throws Exception {
        //Given
        TaskDto taskDto = new TaskDto(1L, "test", "testing");
        TaskDto updatedTaskDto = new TaskDto(1L, "updated task", "even more testing");

        when(taskMapper.mapToTaskDto(dbService.saveTask(taskMapper.mapToTask(taskDto)))).thenReturn(updatedTaskDto);

        Gson gson = new Gson();
        String jsonContent = gson.toJson(taskDto);

        //When & Then
        mockMvc.perform(put("/v1/task/tasks")
                .contentType(MediaType.APPLICATION_JSON)
                .content(jsonContent))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id", is(1)))
                .andExpect(jsonPath("$.title", is("updated task")))
                .andExpect(jsonPath("$.content", is("even more testing")));
    }

    @Test
    public void shouldDeleteTask() throws Exception {
        //Given
        //When & Then
        mockMvc.perform(delete("/v1/task/tasks/{id}","1"))
                .andExpect(status().isOk());
    }

    @Test
    public void shouldCreateTask() throws Exception {
        //Given
        //When & Then
        mockMvc.perform(post("/v1/task/tasks")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"title\":\"another test\"," +
                        "\"content\":\"keep on testing\"}"))
                .andExpect(status().isOk());
    }
}

404及以下所有测试结果:

在org.springframework.test.util.assertionerrors.fail(assertionerrors.java:59)在org.springframework.test.web.servlet.result.assertionerrors.assertequals(assertionerrors.java:98)在org.springframework.test.web.servlet.statusresultmatchers.lambda$matcher$9(statusresultmatchers.java:619)在7)在org.junit.internal.runners.statements.invokeMethod.evaluate(invokeMethod.Java:17)在org.springframework.test.context.junit4.statements.runbeforestexecutioncallbacks.evaluate(runbeforestexecutioncallbacks.Java:74)在org.springframework.test.context.junit4.statements.runaftertestexecutioncallbacks.evaluate(org.junit.runners.ParentRunner$3。Run(ParentRunner.Java:290)在org.junit.runners.ParentRunner.Runchildren(ParentRunner.Java:71)在org.junit.runners.ParentRunner.Runchildren(ParentRunner.Java:288)在org.junit.runners.ParentRunner.Access(ParentRunner.Java:58)在org.junit.runners.ParentRunner.Access$000(ParentRunner.Java:58)在7)在com.intellij.rt.execution.junit.junitstarter.PrepareStreamsandStart(junitstarter.java:242)在com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:70)

共有1个答案

施永宁
2023-03-14

url-/v1/task/tasks不存在于控制器中的任何请求映射中。您的类级控制器具有/v1请求映射,而您的方法级请求映射具有/tasks而不是/task,因此您将得到404 not found错误。

 类似资料:
  • 我在过去一周一直在研究,无法找到解释为什么我在springMVC中的测试用例会抛出404。它会记录未找到页面的警告。我非常确定我的配置是正确的,并且应用程序上下文已加载。为什么mockMvc不执行请求并返回200状态等。? 这是我的测试课: 跟踪以及控制台日志: 最后是我的背景。xml: 如果还需要什么来分析这个问题,请告诉我。

  • 问题内容: 我编写了一个测试UsersController的单元测试。UsersControllerTest.findUser工作正常,但不能正常运行UsersControllerTest.insertGetModifyDelete。 在测试日志中,我可以看到POST请求与UsersController的任何方法都不匹配,但是我不明白为什么。您能帮我这个吗? 这是我其余的Java类: 我有2种方法

  • 我正在尝试为我的Spring项目运行集成测试,它是一个简单的get方法,用于从DB返回给定id的字符串输出。但是在Mockmvc中,我一直在Mockmvc上得到一个NullPointerException。在我的测试范围内执行。 以下是测试: 这里是控制器-输出控制器: 完全错误是:

  • 我有以下控制器: 重启控制器。爪哇 我已经使用mockMvc对web层进行了测试,用户服务bean按照标准进行了模拟: 重启控制器监控测试。爪哇 test正在返回404而不是200状态,并且没有返回正文中的错误消息,这暗指404不是“真正的”404(它没有返回,因为正确的响应正在返回,它返回是因为其他原因)。我还认为其他404状态中的一些可能会在相同的上下文中返回。

  • 共享Api实现类,添加preauthorize-admin,查看所有用户 这是我的JUnit测试,我发送get请求并返回403错误。

  • Spring靴1.5.9及以下版本: 我一直得到:WARNo.s.web.servlet.PageNotFind-没有找到HTTP请求与URI[api/v1/app/pool]在DispatcherServlet与名称的映射”