Spring Boot JUNIT5 Mokito当然后返回不工作

kb5ga3dv  于 2023-11-17  发布在  Spring
关注(0)|答案(3)|浏览(158)

更新

奇怪的是,当我在控制器中设置String token = ""而不是String token = null时,测试通过了。
Mokito返回默认值null而不是OK字符串。所以我的测试失败了。

Caused by: java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "result" is null

字符串
我的测试方法:

@WebMvcTest(ClusterController.class)
class ClusterControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @MockBean
        private ClusterService clusterService;
    
        @MockBean
        private ClusterRestService clusterRestService;

        @Test
        void testPatchTestClusterVM() throws Exception {     

        //Given
        when(clusterService.startPatchingTest(any(), anyString(), anyString(), anyString())).thenReturn("OK");
        
        //When
        RequestBuilder request = MockMvcRequestBuilders
                .post("/patch/clustertest/mycluster/host/vc2crtp1770461np")
                .accept(MediaType.APPLICATION_JSON);
        
        //Then
        mockMvc.perform(request)
                .andExpect(status().isOk())
                .andReturn();       
    }


我的控制器方法:

@PostMapping("/patch/clustertest/{clustername}/host/{hostname}")
    public ResponseEntity<?> patchClusterTestVM(@PathVariable("clustername") String clusterName, @PathVariable("hostname") String hostName) {
        String token = null;
        String uuid = UUID.randomUUID().toString();     
        String result = clusterService.startPatchingTest(new ClusterDetailsClass(1L, "mycluster"), hostName, token, uuid);
        return new ResponseEntity<String>(result.toLowerCase(), HttpStatus.OK);
    }


应用测试:

@SpringBootTest
class MyApplicationTests {

    @Test
    void contextLoads() {
    }

}

zfycwa2u

zfycwa2u1#

ArgumentMatchers#anyString匹配任何非空字符串,因此以下存根仅适用于非空令牌:

when(clusterService.startPatchingTest(any(), anyString(), anyString(), anyString())).thenReturn("OK");

字符串
这就解释了为什么Mockito只在token为非null(例如空字符串)时返回“OK”。如果token为null,则参数不匹配,导致Mockito返回默认值(null)。
如果您使用的是Mockito 2.1.0或更高版本,则应使用nullable(String.class)来匹配可空字符串,如here所述,否则应使用any()

a11xaf1n

a11xaf1n2#

返回一个String而不是ResponseEntity。
尝试

//Given
ResponseEntity okReturn = new ResponseEntity<String>("result", HttpStatus.OK)
when(clusterService.startPatchingTest(any(), anyString(), anyString(), anyString())).thenReturn(okReturn);

字符串

cl25kdpy

cl25kdpy3#

你没有展示所有相关的代码,比如测试类注解以及如何初始化和注入clusterservice。我认为这应该可以工作:

@SpringBootTest
@AutoConfigureMockMvc
class ClusterTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private ClusterService clusterService;

    @Test
    void testPatchTestClusterVM() throws Exception {     

        //Given
        when(clusterService.startPatchingTest(any(), anyString(), anyString(), anyString())).thenReturn("OK");

字符串

相关问题