【问题标题】:Spring-boot testing a rest controller with pageableSpring-boot 测试具有可分页功能的 REST 控制器
【发布时间】:2019-01-17 12:21:39
【问题描述】:

我正在尝试测试以下控制器:

@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 时,它可以正常工作。

【问题讨论】:

    标签: rest spring-boot junit spring-data-jpa mockito


    【解决方案1】:

    我认为您没有正确模拟/初始化您的 TitleService,这就是您收到 500 响应代码的原因。

    您可以通过模拟 TitleService 并将其传递给您测试的控制器来修复它:

    @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
    
    }  
    

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 2016-01-29
      • 2018-01-02
      • 2017-06-28
      • 2019-03-07
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多