@PostMappingアノテーションが定義しているメソッドは与えられたURI表現式と一致するHTTP POSTの要請を処理します。
// import 省略
@RequestMapping(value = "/api/person")
@RestController
@Slf4j
public class PersonController {
@Autowired
private PersonService personService;
@Autowired
private PersonRepository personRepository;
@GetMapping("/{id{")
public Person getPerson(@PathVariable Long id) {
return personService.getPerson(id);
}
@PostMapping
@ResponseStatus(HttpStatus.OK)
public void postPerson(@RequestBody Person person) {
personService.put(person);
log.info("person -> {}", personRepository.findAll());
}
}
@RestControllerは、PersonControllerクラスはREST API Controllerを使用しますよとの宣言アノテーションです。
クラスに定義している@RequestMappin(value="/api/person")のscopeはクラス全体なので、
postPerson()は("/api/person")のURIに対応します。
log.info()の"{}"には、二つ目のfindAll()が出力されます。log.inforを使うには@Slf4j定義が要!
// import 省略
@SpringBootTest
public class PersonControllerTest {
@Autowired
private PersonController personController;
private MockMvc mockMvc;
@Test
void getPerson() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(personController).build();
mockMvc.perform(
MockMvcRequestBuilders.get("/api/person/1"))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk());
}
@Test
void postPerson() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(personController).build();
mockMvc.perform(
MockMvcRequestBuilders.post("/api/person")
.contentType(MediaType.APPLICATION_JSON)
.content("{\n" +
" \"name\": \"martin2\", \n" +
" \"age\": 20, \n" +
" \"bloodType\": \"A\"\n" +
"}"))
.andDo(print())
.andExpect(status().isCreated());
// .andExpect(status().isOk());
}
}
PersonControllerクラスのテストコードです。
personConteollerにDI(Dependency Injection)して、mockmvcを生成してます。
MockMvcRequestBuildersのpostは、PersonControllerの@PostMapping定義メソッドに相当します。
contentにはjsonデータのため、contentTypeにJSONを定義しなければなりません。
PersonControllerのpostPersonに定義したのは「@ResponseStatus(HttpStatus.OK)」のため、
andExpectをstatus().isOK()の確認をしています。
もし、データがちゃんと作られたかを確認したい場合は
isOK → isCreated()に変えて
@ResponseStatus(HttpStatus.OK) → @ResponseStatus(HttpStatus.CREATED)に変えればOK!
追記で、conetentにjsonのデータが入っていますが、.jsonファイルに以下のように書きコピーして
.content("")に貼り付ければ簡単に整形されます!