MockMvc возвращается 404 - PullRequest
       36

MockMvc возвращается 404

0 голосов
/ 13 октября 2019

Я написал контроллер, который использовал разные значения для каждого отображения. Теперь я перефразировал его, чтобы использовать одно и то же значение для всех отображений, однако я не знаю, как заставить тест работать, потому что он возвращает 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.util.AssertionErrors.assertEquals (AssertionErrors.java:98) в org.springframework.test.web.servlet.result.StatusResultMatchers.lambda $ matcher $ 9 (StatusResultMatchers.java:6. 6). springframework.test.web.servlet.MockMvc $ 1.andExpect (MockMvc.java:195) в com.crud.tasks.controller.TaskControllerTest.shouldFetchGivenTask (TaskControllerTest.java:74) для дочернего объекта sun.refl. в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.jun Reflective: 12) на org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) на org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17f) на org.spr. context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate (RunBeforeTestExecutionCallbacks.java:74) по адресу org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate.jj.tj.tj.tj.tj. высказыванияоценить (SpringRepeat.java: 84) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRuntest.racon.rate.rate.rate.rate) org.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner PunRuneorg.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRjun268) в org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statements.RunAfterbackest.jestCateCaseCateCateCateCateCateCateCate.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:190) по адресу org.junit.runner.JUnitCore.run (JUnitCore.java:137) по адресу com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArt.jj.execution.junit. .main (JUnitStarter.java:70)

1 Ответ

0 голосов
/ 13 октября 2019

URL - /v1/task/tasks отсутствует ни в одном отображении запроса на вашем контроллере. ваш контроллер уровня класса имеет /v1 сопоставление запроса, а ваше сопоставление запроса уровня метода имеет /tasks, а не /task, поэтому вы получаете ошибку 404 not found.

...