代码之家  ›  专栏  ›  技术社区  ›  K. Ayoub

Spring-boot测试一个可分页的rest控制器

  •  2
  • K. Ayoub  · 技术社区  · 8 年前

    我正在测试以下控制器:

    @GetMapping("movies")
    public Page<Title> getAllMovies(@PageableDefault(value=2) Pageable pageable){        
        return this.titleService.getTitleByType("Movie", pageable);
    }
    

    下面是测试课程:

    @RunWith(SpringRunner.class)
    @WebMvcTest(TitleController.class)
    @EnableSpringDataWebSupport
    public class TitleControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @MockBean
        private TitleService titleService;
    
        // Test controller method - getAllMovies
        @Test
        public void getAllMovies() throws Exception {
            Title title = new Title();
            title.setId((short)1);
            title.setName("The Godfather");
            title.setType("Movie");    
    
            List<Title> titles = new ArrayList<>();
            titles.add(title);
            Page<Title> page = new PageImpl<>(titles);
    
            given(this.titleService.getTitleByType("Movie", PageRequest.of(0,2))).willReturn(page);
            mockMvc.perform(MockMvcRequestBuilders.get("/movies"))
                    .andExpect(status().isOk());
        }
    }  
    

    当我运行测试时,它失败并给出以下消息:

    java.lang.AssertionError: Status 
    Expected :200
    Actual   :500
    

    当我测试url时 http://localhost:8080/movies 它工作正常。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Marcin Bukowiecki    8 年前

    我认为你没有正确模拟/初始化 TitleService 这就是为什么你得到 500 响应代码。

    你可以通过嘲笑 服务 并将其传递给您的测试控制器:

    @RunWith(SpringJUnit4ClassRunner.class)
    public class TitleControllerTest {
    
        private MockMvc mockMvc;
    
        private TitleController underTest;
    
        @Mock
        private TitleService titleService;
    
        @Before
        public void init() {
            underTest = new TitleController(titleService);
    
            //DO THE MOCKING ON TITLE SERVICE
            // when(titleService.getTitleByType()) etc.
    
            mockMvc = MockMvcBuilders
                    .standaloneSetup(underTest)
                    .build();
        }
    
        //your tests
    
    
    }  
    

    或:

    @RunWith(SpringRunner.class)
    @WebMvcTest(TitleController.class)
    @EnableSpringDataWebSupport
    public class TitleControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @Autowired
        private TitleController titleController;
    
        @MockBean
        private TitleService titleService;
    
        @Before
        public void init() {
            titleController.setTitleService(titleService);
    
            //DO THE MOCKING ON TITLE SERVICE
            // when(titleService.getTitleByType()) etc.
        }
    
        //your tests
    
    }