首页 > 解决方案 > 在 Spring 中使用 Authentication 类测试控制器

问题描述

在我的控制器方法中,我使用身份验证类来获取登录的用户数据。

它看起来像这样:

@GetMapping("/somepath")
    public ResponseEntity<SomeType> someMethod(Authentication user){
        ...
    }

我不知道如何测试它。我尝试了@WithMockUser 注释,.with(user(...)),但它不起作用。有谁知道如何正确地做到这一点?

标签: javaspringspring-bootspring-securityspring-test

解决方案


理想情况下,如果您遵循良好的编码实践,您将永远不会最终为控制器或数据律师编写测试用例。理想情况下,测试用例用于测试代码中涉及的一些业务逻辑,通过引用我们应该将所有业务写入服务。

在控制器上应该做的工作非常少,比如请求验证。

无论如何,下面的代码可能会帮助您测试控制器方法。

   MockMvc mvc;
   @Autowired
   WebApplicationContext webApplicationContext;

   protected void setUp() {
      mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
   }
   protected String mapToJson(Object obj) throws JsonProcessingException {
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.writeValueAsString(obj);
   }
   protected <T> T mapFromJson(String json, Class<T> clazz)
      throws JsonParseException, JsonMappingException, IOException {

      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.readValue(json, clazz);
   }


@Test
public void someMethodTest() throws Exception {
   String uri = "/somepath";
   Authentication authentication = new Authentication ();

   String inputJson = super.mapToJson(authentication);
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri)
      .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn();

   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   // Assert whatever you want 
   assertEquals();
}

推荐阅读