java - 如何在 Spring Boot 中为 Controller 编写单元测试

标签 java rest unit-testing spring-boot junit

我是单元测试和 TDD 的新手。我想对我在 Spring Boot 中编写的 Controller 和服务类应用单元测试。

我已经使用教程实现了测试类。但是,我无法成功实现它。我已经包含了我当前的代码。

Controller

@RestController
@RequestMapping("/api")
public class MyController {
    private static final Logger LOGGER = LoggerFactory.getLogger(AdminController.class);
    @Autowired
    MyService myService;

    @PostMapping("/create")
    public ResponseEntity<?> createUser(@RequestHeader("Authorization") String token, 
        @RequestBody User user){
        ResponseDTO finalResponse = new ResponseDTO();
        try {
            ResponseEntity<?> entity = myService.create(token, user);             
            finalResponse.setMessageCode(entity.getStatusCode());
            finalResponse.setMessage("Success");
            finalResponse.setError(false);
            ResponseEntity<ResponseDTO> finalEntity = ResponseEntity.ok().body(finalResponse);
        return finalEntity;
        } catch (Exception e) {      
            finalResponse.setMessageCode(HttpStatus.EXPECTATION_FAILED);
            finalResponse.setMessage(e.getMessage());
            finalResponse.setError(true);
            ResponseEntity<ResponseDTO> finalEntity = 
            ResponseEntity.ok().body(finalResponse);
            return finalEntity;
    }
}

响应DTO

public class ResponseDTO {
    private HttpStatus messageCode;
    private String message;
    private String messageDetail;
    private Object body;
    private boolean error;

    //setters and getters
}

当前测试类别

@RunWith(SpringRunner.class)
public class MyControllerTest {
    private MockMvc mockMvc;

    @InjectMocks
    private MyController myController;

    @Before
    public void setUp() throws Exception {
    mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
    }

    @Test
    public void testCreateUser() throws Exception {
        mockMvc.perform(post("/api/create")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isCreated())
            .andExpect(jsonPath("$.*", Matchers.hasSize(1)));
    }

}

当我运行测试类时,我收到WARN Resolved [org.springframework.web.bind.MissingRequestHeaderException: Missing request header 'Authorization' for method parameter of type String]

我在这里做错了什么?任何帮助将不胜感激。

最佳答案

你的测试可能是这样的:

 @Test
public void testCreateUser() throws Exception {
    mockMvc.perform(post("/api/create")
        .accept(MediaType.APPLICATION_JSON)
        .header("AUTH_TOKEN", TOKEN)
        .content(ObjectToJsonUtil.convertObjectToJsonBytes(user)))
        .andExpect(status().isCreated())
        .andExpect(jsonPath("$.*", Matchers.hasSize(1)));
}

您必须将对象 user 转换为 json。 因此,您为此创建了一个 util 类:

public class ObjectToJsonUtil {
    public static byte[] convertObjectToJsonBytes(Object object)
            throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

        JavaTimeModule module = new JavaTimeModule();
        mapper.registerModule(module);

        return mapper.writeValueAsBytes(object);
    }

}

希望对你有帮助!

关于java - 如何在 Spring Boot 中为 Controller 编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56070205/

相关文章:

java - 尝试释放内存时出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005)

rest - 将curl命令转换为PowerShell

java - Zen desk Api 名称用户 : Name: is too short (minimum one character) 的问题

c++ - 单元测试。文件结构

c# - 如何模拟 dbcontext?

Java HtmlUnit 使用用户名和密码登录返回登录页面

java - 如何从新 Activity 返回主抽屉导航 Activity

java - 无法存储和加载属性

python - XML验证错误: Char 0x0 out of allowed range.

ruby - 我应该使用什么策略对 ruby (rspec)中的文件进行单元测试?