Day 2
์ ๋ฒ ์๊ฐ์ ์ด์ด์ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํด๋ณด๊ธฐ ์ํ ๊ณผ์
๐์ ๋ฒ์ ๋ง๋ค์๋ ํ
์คํธ๋ฅผ ์ํ ์ฝ๋๋ฅผ ๊ฒ์ฆ
ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋
src/test/java ๋๋ ํ ๋ฆฌ๋ก ๊ฐ์
ํ ์คํธํ๋ ค๋ ์ฝ๋๊ฐ ๋ค์ด์๋ ํจํค์ง์ ๋๊ฐ์ ํจํค์ง๋ฅผ ์์ฑํ๊ณ
ํ ์คํธํ๋ ค๋ ํด๋์ค์ ์ด๋ฆ์ Test๋ฅผ ๋ถํ ์ด๋ฆ์ผ๋ก ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๋ค
src/test/java/com/kyu/book/springboot/HelloControllerTest.class
package com.kyu.book.springboot;
import com.kyu.book.springboot.web.HelloController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void REHello() throws Exception{
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
@RunWith(SpringRunner.class)
ํ ์คํธ๋ฅผ ์งํํ ๋ JUnit์ ๋ด์ฅ๋ ์คํ์ ์ธ์ ๋ค๋ฅธ ์คํ์๋ฅผ ์คํ
์ฌ๊ธฐ์๋ SpringRunner๋ผ๋ ์คํ๋ง ์คํ์๋ฅผ ์ฌ์ฉ
์คํ๋ง ๋ถํธ ํ ์คํธ์ JUnit ์ฌ์ด์ ์ฐ๊ฒฐ์ ์ญํ ์ ์ํ
@WebMvcTest
์ ์ธํ๊ฒ ๋๋ฉด โ @Controller, @ControllerAdvice ๋ฑ์ annotation์ ์ฌ์ฉํ ์ ์์
@Service, @Repository, @Component๋ฑ์ annotation์ ์ฌ์ฉํ ์ ์์
์ฌ๋ฌ ์คํ๋ง annotation์ค์์ Web์ ์ง์คํ ์ ์๋ annotation์ด๋ค
์ฌ๊ธฐ์์๋ ์ปจํธ๋กค๋ฌ๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ์ธํจ
@Autowired
์คํ๋ง์ด ๊ด๋ฆฌํ๋ Bean์ ์ฃผ์ ๋ฐ๋๋ค
Mockmvc
์น API๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉํจ
์คํ๋ง MVC ํ ์คํธ์ ์์์
์ด ํด๋์ค๋ฅผ ํตํด HTTP GET, POST ๋ฑ์ ๋ํ API ํ ์คํธ๋ฅผ ํ ์ ์์
perform(get("/hello"))
MockMvc๋ฅผ ํตํด /hello ์ฃผ์๋ก http get์์ฒญ
๋ฉ์๋ ์ฒด์ด๋์ด ๊ฐ๋ฅํด ์ฌ๋ฌ ๊ฒ์ฆ์ ์ด์ด์ ๊ฐ๋ฅ
andExpect(status().isOk())
perform์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฒ์ฆ
http header์ status๋ฅผ ๊ฒ์ฆํ๋ค โ 200, 404, 500์ ๊ฐ์ด ์ํ ๊ฒ์ฆ
isOk()๋ ์ํ ์ฝ๋๊ฐ 200์ธ์ง ์๋์ง๋ฅผ ๊ฒ์ฆ
andExpect(content().string(hello))
mvc.perform์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆ
์๋ต ๋ณธ๋ฌธ์ ๋ด์ฉ์ ๊ฒ์ฆํ๋ค
Controller(ํ ์คํธํ๋ ์ฝ๋)์์ hello๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ด ๋ง๋์ง ํ์ธ
๐Lombok
gradle์ ์ถ๊ฐ
compile('org:projectlombock:lombok')
plugins์ ์ถ๊ฐ
๋กฌ๋ณต์ ํ๋ก์ ํธ๋ง๋ ์ค์ ์ ํด์ค์ผํจ โ build.gradle์ ์ถ๊ฐ / Settings > Build > Compiler > Annotation processors > Enable annotation processing
์์ ๋ฐฉ์์ผ๋ก gradle์ ์ถ๊ฐํ๋ ค๋๊น ์๋จ
๊ทธ๋์
build.gradle์ compileํ๋ dependencies์ ์๋์ ๊ฐ์ด ๋ฃ์ด์ฃผ๋๊น ์ ๋จ
annotationProcessor("org.projectlombok:lombok")
compileOnly("org.projectlombok:lombok")
๐HelloController์ฝ๋๋ฅผ ๋กฌ๋ณต์ผ๋ก ๋ณํํด๋ณด๊ธฐ
web์๋์ dtoํจํค์ง ์ถ๊ฐ
๋ชจ๋ ์๋ต dto๋ ์ด dtoํจํค์ง์ ์ถ๊ฐํ ์์
src/main/java/com/kyu/book/springboot/web/dto/HelloResponseDto.class
package com.kyu.book.springboot.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
private final String name;
private final int amount;
}
@RequestArgsConstructor
์ ์ธ๋ ๋ชจ๋ final ํ๋๊ฐ ํฌํจ๋ ์์ฑ์๋ฅผ ์์ฑํด์ค
final์ด ์๋ ํ๋๋ ์์ฑ์์ ํฌํจ๋์ง ์์
์์ ์ฝ๋์ ํ ์คํธ์ฝ๋
src/main/java/com/kyu/book/springboot/web/dto/HelloResponseDtoTest.class
package com.kyu.book.springboot.web.dto;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public void lm_fn_test(){
String name = "test";
int amount = 1000;
HelloResponseDto dto = new HelloResponseDto(name, amount);
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
*์ด ์ฝ๋๋ฅผ ์งํํ๋ ๊ณผ์ ์์ lombok์ @Getter๊ฐ ์ ์๋จน์์๋ค โ ๊ทธ๋์ plugin์ ๋ค์ด๊ฐ์ lombok์ disabled > apply ์ดํ, enabled > apply ํ๋๊น ์๋จ
*test ์งํ์ด ๋ถ๊ฐ๋ฅํ๋ค โ github์ ์ง๋ฌธํ์ด์ง๋ฅผ ๊ฐ์ ์ฐพ์๋ณด๋๊น gradle์ ๋ฒ์ ๋ฌธ์ ๊ฐ ์์๋ค.
์ฌ์ ํ ํ์ ์์๋ gradle4๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋๊น ๊ทธ๋ ค๋ฌ๋ํ๊ณ gradle4๋ฅผ ์ฌ์ฉํ์
๋ฒ์ ์ด ์ด๋ฏธ ์ฌ๋ผ๊ฐ์์๋ ๋ณ๊ฒฝํ๋๋ฐฉ๋ฒ์
terminal์ ์ด์ด์
./gradlew wrapper โgradle-version 4.10.2
๋ฅผ ์ ์ฉํด์ฃผ๋ฉด ์ ์์ ์ผ๋ก ํ ์คํธ๊ฐ ์งํ๋๋ค
assertThat
assertj๋ผ๋ ํ ์คํธ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒ์ฆ ๋ฉ์๋
๊ฒ์ฆํ๊ณ ์ถ์ ๋์์ ๋ฉ์๋ ์ธ์๋ฅผ ๋ฐ๋๋ค
๋ฉ์๋ ์ฒด์ด๋ ์ง์๋จ
isEqualTo()
๋๋ฑํ์ง ๋น๊ตํ๋ ๋ฉ์๋
๊ฐ์ด ๊ฐ์ผ๋ฉด ์ฑ๊ณต
assertj์ ์ฅ์ : ๋ฐฑ๊ธฐ์ ๋ ์ ํ๋ธ๋ฅผ ๋ณด๊ณ ๋ฐฐ์ฐ์
๐ResponseDto๋ฅผ ์ฌ์ฉํ๋๋ก ์ถ๊ฐ
src/main/java/com/kyu/boot/springboot/web/dto/HelloResponseDto.class์ ์ถ๊ฐ๋์ฝ๋
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name")String name,
@RequestParam("amount")int amount){
return new HelloResponseDto(name, amount);
}
@RequestParam
์ธ๋ถ์์ API๋ก ๋๊ธด ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ ธ์ค๋ annotation์ ๋๋ค.
์ฌ๊ธฐ์์๋ ์ธ๋ถ์์ name(@RequestParam("name")) ์ด๋ ์ด๋ฆ์ผ๋ก ๋๊ธด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ name(String name)์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
๐์ถ๊ฐ๋ API๋ฅผ ํ
์คํธ
src/test/java/com/kyu/book/springboot/web/HelloControllerTest.class์ ์ถ๊ฐ๋ ์ฝ๋
@Test
public void REHelloDto() throws Exception{
String name = "hello";
int amount = 1000;
mvc.perform(
get("/hello/dto")
.param("name", name)
.param("amount", String.valueOf(amount))
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name)))
.andExpect(jsonPath("$.amount", is(amount)));
}
param
API ํ ์คํธํ ๋ ์ฌ์ฉ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์
๋จ, ๊ฐ์ String๋ง ํ์ฉ
๊ทธ๋์ ์ซ์/๋ ์ง ๋ฑ์ ๋ฐ์ดํฐ๋ ๋ฑ๋กํ ๋๋ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํด์ผ๋ง ๊ฐ๋ฅ
jsonPath
JSON ์๋ต๊ฐ์ ํ๋๋ณ๋ก ๊ฒ์ฆํ ์ ์๋ ๋ฉ์๋
$๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋๋ช ์ ๋ช ์
์ฌ๊ธฐ์ name, amount๋ฅผ ๊ฒ์ฆํ๋ $.name, $.amount๋ก ๊ฒ์ฆ
*์๊พธ ํ ์คํธ์ Test events were not received๊ฐ ๋ธ
โ Preference > Build, Execution, Deployment > Build Tools > Gradle๋ก ์ด๋ํด์
โRun test using์ Intellij IDEA๋ก ๋ณ๊ฒฝ
Last updated
Was this helpful?