Spring boot 带有Mockito测试用例的Spring引导控制器问题

Spring boot 带有Mockito测试用例的Spring引导控制器问题,spring-boot,junit,mockito,dto,Spring Boot,Junit,Mockito,Dto,我对Mockito完全陌生,我必须为我的REST控制器编写一个测试用例,但我不确定应该从哪里开始。任何帮助都将不胜感激。我已经根据给出的建议更新了控制器 这是我的控制器: @RestController @RequestMapping("/api") public class TestController { @Autowired TestService _testService; @RequestMapping(value = "/getsearchDetailCourse", method

我对Mockito完全陌生,我必须为我的REST控制器编写一个测试用例,但我不确定应该从哪里开始。任何帮助都将不胜感激。我已经根据给出的建议更新了控制器

这是我的控制器:

@RestController
@RequestMapping("/api")
public class TestController {
@Autowired
TestService _testService;

@RequestMapping(value = "/getsearchDetailCourse", method = RequestMethod.GET)
public List<TestDto> getsearchDetailCourse(@RequestParam("courseName") String courseName,
                                             @RequestParam("courseId") Long courseId) throws Exception {      
    return (List<TestDto>) _testService.searchDetailCourse(courseName, courseId);

}
}
这是我的测试:

@RunWith(SpringRunner.class)
@WebMvcTest(value = TestController.class, secure = false)
public class TestMethod {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private TestService testService;

    TestDto testDto = new testDto("Test",2744L);

    @Test
    public void retrieveDetailsForCourse() throws Exception {

        Mockito.when(
            testService.searchDetailCourse(Mockito.anyString(),
                    ,Mockito.anyLong())).thenReturn(testDto);

        RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
            "/api/getsearchDetailCourse").accept(
            MediaType.APPLICATION_JSON);

        MvcResult result = mockMvc.perform(requestBuilder).andReturn();

        System.out.println(result.getResponse());
        String expected = "[{\"numberOfCourse\":\"Testing1\",\"courseId\":2744},{\"numberOfCourse\":\"Testing2\",\"courseId\":2744}]";

        JSONAssert.assertEquals(expected, result.getResponse()
            .getContentAsString(), false);
    }
}

我想测试控制器,请帮我更正上面的测试用例。

您错过了Spring的全部要点,即依赖注入。您不能执行
newtestservice()
。相反,您必须告诉Spring将TestService注入到您的控制器中。这就是允许在您的测试中注入模拟测试服务的原因(其中有几个好处)。目前这是不可能的,因为每次你调用你的方法时,它都会创建一个新的TestService,因此永远不会使用任何模拟。我已经更新了我的控制器,但我的测试方法不起作用,请帮助你准确地定义“不起作用”。也就是说,您让服务返回一个DTO,并且您希望收到一个包含两个DTO的JSON数组。那怎么行?为什么它还要编译?如果服务应该返回一个列表,那么它的返回类型应该是list,让它返回一个DTO甚至不应该编译。
@RunWith(SpringRunner.class)
@WebMvcTest(value = TestController.class, secure = false)
public class TestMethod {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private TestService testService;

    TestDto testDto = new testDto("Test",2744L);

    @Test
    public void retrieveDetailsForCourse() throws Exception {

        Mockito.when(
            testService.searchDetailCourse(Mockito.anyString(),
                    ,Mockito.anyLong())).thenReturn(testDto);

        RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
            "/api/getsearchDetailCourse").accept(
            MediaType.APPLICATION_JSON);

        MvcResult result = mockMvc.perform(requestBuilder).andReturn();

        System.out.println(result.getResponse());
        String expected = "[{\"numberOfCourse\":\"Testing1\",\"courseId\":2744},{\"numberOfCourse\":\"Testing2\",\"courseId\":2744}]";

        JSONAssert.assertEquals(expected, result.getResponse()
            .getContentAsString(), false);
    }
}