单元测试-使用mockmvc测试带有hashmap的@requestheader的控制器

m2xkgtsf  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(398)

我有一个控制器,其结构如下:

@RequestMapping(value="/validate", method=RequestMethod.POST)
    public ResponseEntity<Jwt> IsValid(@RequestBody UserRequest userRequest, @RequestHeader Map<String, String> header) throws Exception {
    if(header.contains("key") && header.contains("secret") {
        process(header.get("key"), header.get("secret"));
        ...
        ...
    }
}

我正在使用mockmvc为这个控制器编写一个单元测试:

@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@SpringBootTest
public class AuthenticatorServiceTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void CorrectKeyValidation throws Exception {
        String key = "correct-key";
        String secret = "correct-secret";
        Map<String, String> map = new HashMap<>();
        map.put("key", key);
        map.put("secret", secret);

        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/validate")
                .header() // <- doesn't accept Map here.
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk()).andReturn();
        ...
        ... 
    }  
}

自从 header 方法 MockMvcRequestBuilders 只接受字符串,我真的不知道如何使用mockmvc来测试我的控制器,其中有 Map<String, String> 作为一个 @RequestHeader . 任何帮助都将不胜感激!

z3yyvxxp

z3yyvxxp1#

还有另一个类似于下面的方法(.headers(*),您可以使用它,只需验证。

Map<String, String> map = new HashMap<>();
        map.put("key", key);
        map.put("secret", secret);
HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setAll(map);
        MvcResult result = mvc.perform(MockMvcRequestBuilders
                .post("/scheduler/enable")
                .headers(httpHeaders)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(this.getRequstAsJSON()))
                .andDo(print())
                .andReturn();

希望这是有用的。

相关问题