在 Restcontroller 的单元测试期间,我的 Mocking 类不起作用

Posted

技术标签:

【中文标题】在 Restcontroller 的单元测试期间,我的 Mocking 类不起作用【英文标题】:During unit test of Restcontroller my Mocking class does not work 【发布时间】:2021-11-22 20:19:09 【问题描述】:

我需要在 RestController 中使用模拟类测试一种方法。但是java不明白,然后它的mock类并尝试调用它。但是,具有相同模拟类的这种方法可以成功。 我的 RestController:

@RestController
public class OrderController 

    @Autowired
    ServiceOrder serviceOrder;

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @RequestMapping(value = "/orders", method= RequestMethod.POST, produces="application/json; charset=UTF-8")
    public List<Order> sortOrders(@RequestParam("field") String field) 
        return serviceOrder.sortOrders(field);

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @RequestMapping(value = "/orders/completed/period", method= RequestMethod.POST, produces="application/json")
    public long showCompletedOrdersInPer(
            @RequestParam (value = "start") String startDate,
            @RequestParam (value = "end") String endDate) 
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate start = LocalDate.parse(startDate, formatter);
        LocalDate end = LocalDate.parse(endDate, formatter);
        return serviceOrder.completedOrdersInPeriod(start, end);
    

好吧,方法 sortOrders() 的测试没问题,但 showCompletedOrdersInPer() 的测试失败。 我的测试课:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = ControllersTestConfig.class)
@WebAppConfiguration
public class OrderControllerTest 

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Autowired
    OrderController orderController;

    @Autowired
    ServiceOrder serviceOrder;

    private MockMvc mockMvc;
    @BeforeEach
    public void setup() 
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
    

    // Test from method OrderController.sortOrders
    // Description: we should get response.status OK
    @Test
    public void sortOrdersTest() throws Exception 
        Mockito.when(serviceOrder.sortOrders(any())).thenReturn(null);
        mockMvc.perform(MockMvcRequestBuilders.post("/orders?field=1")).andExpect(MockMvcResultMatchers.status().isOk());
    

    // Test from method OrderController.showCompletedOrdersInPer
    // Description: we should get response.status OK
    @Test
    public void showCompletedOrdersInPerTest() throws Exception 
        Mockito.when(serviceOrder.completedOrdersInPeriod(any(), any())).thenReturn(1L);
        mockMvc.perform(MockMvcRequestBuilders.post("/orders/completed/period?start=2020-01-01&end=2022-01-01")).andExpect(MockMvcResultMatchers.status().isOk());
    

这是配置类:

public class ControllersTestConfig 

    @Bean
    public ServiceOrder serviceOrder() 
        return Mockito.mock(ServiceOrder.class);
    
    
    @Bean
    public OrderController orderController()
        return new OrderController();
    


当我运行 sortOrdersTest() 时,测试正常,当我运行 showCompletedOrdersInPerTest() 时,我有

Status expected:<200> but was:<500>
Expected :200
Actual   :500

如果我使用调试运行测试,我看到,然后在 sortOrders() 模拟工作并且 serviceOrder.sortOrders(field) 不调用,并且在 showCompletedOrdersInPer() 模拟不工作并且 java 尝试调用 serviceOrder.completedOrdersInPeriod(start,结束)并且我的状态为 500。 请帮帮我!

【问题讨论】:

【参考方案1】:

嗯,在 dao 层将 Integer 解析为 Long 是有问题的。我解决了它并完成了测试。

【讨论】:

以上是关于在 Restcontroller 的单元测试期间,我的 Mocking 类不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Rest控制器单元测试

spring boot?Swagger2文档构建及单元测试

在 CORS 期间 Spring-Boot RestController 失败

在 CORS 期间 Spring-Boot RestController 失败

在单元测试期间填充 Spring @Value

fileManager.createFileAtPath 在单元测试期间失败