๐ฅ TIL - Day 56
3์ฐจ ํ๋ก์ ํธ ๋๋ Spring Rest Docs
๋ฅผ ์ด์ฉํด์ API๋ฌธ์๋ฅผ ์๋ํํด์ผ ํ๋ค.
Spring Rest Docs
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ์๋ก ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ํ
์คํธ๊ฐ ๋ชจ๋ ์ฑ๊ณตํด์ผ API๋ฌธ์๊ฐ ์์ฑ๋๋ ๊ฒ์ด๋ค.
Spring Rest Docs
๋ฅผ ๋ฐ๋ก ์ ์ฉํด๋ณด๊ธฐ ์ ์ Spring์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ํ
์คํธ ํ๋ ์์ํฌ์ธ Junit5
์ ๋ํด ์์๋ณด์.
๐ ์ผ๋จ ์ด๋ ธํ ์ด์ ๋ถํฐ ์ด์ง ์์๋ณด์
@Test
- ํ ์คํธ ๋ฉ์๋ ์ ์
- @DisplayName ์ผ๋ก ํ ์คํธ ๋ฉ์๋์ ๋ํ ์ด๋ฆ์ ์ ์ํ ์ ์๋ค.
- @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate ์ด ๋ถ์ ๋ฉ์๋๋ ํ ์คํธ ๋ฉ์๋๋ก ์ทจ๊ธ๋๋ค. ์ผ๋จ ์ด๋ฆ๋ง ์์๋์.
- @Disabled: ํ ์คํธ ํด๋์ค or ๋ฉ์๋ ๋นํ์ฑํ
@BeforeEach, @AfterEach
- ํ ์คํธ ์ ,ํ๋ก ์คํ
- ๊ฐ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ,ํ๋ก ๋งค๋ฒ ํธ์ถ๋๋ค.
@BeforeAll, @AfterAll
- ํ ์คํธ ์ ,ํ๋ก ์คํ
- ํ ์คํธ ์ ,ํ๋ก ๋จ ํ ๋ฒ๋ง ํธ์ถ๋๋ค.
@SpringBootTest
- ๋ฌด๊ฑฐ์ด ํ ์คํธ
- ํ์ํ ๋ชจ๋ ๋น์ IoC์ ์ฌ๋ ค๋๊ณ ํ ์คํธ๋ฅผ ์ํํ๋ค. (ํตํฉ ํ ์คํธ)
@WebMvcTest
- Controller๋ฅผ ๋์์ผ๋ก ํ ์คํธ
- Controller ๊ณ์ธต์ ๋น๋ง ๋น์ผ๋ก ์ฌ๋ฆฌ๊ณ ์ํํ๋ ํ ์คํธ์ด๋ค. ๋ณดํต Controller์ดํ Service๊ณ์ธต์ Mockingํด์ ์ฌ์ฉํ๋ค.
@ExtendWith
- @SpringBootTest๊ฐ ์๋ @WebMvcTest์์ Mockito๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด?
@WebMvcTest(TestController.class)
@ExtendWith(MockitoExtension.class)
๐ ํ ์คํธ ์คํ์์
ํน์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ์ ์์๋ฅผ ์ง์ ํ ์ ์๋ค.
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TestClass {
@Test
@Order(1)
void ํ
์คํธ1() { ... }
@Test
@Order(2)
void ํ
์คํธ2() { ... }
}
๐ ํ ์คํธ ๋ฐ๋ณต์คํ
ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ฐ๋ณตํด์ ์คํํด์ผ ํ ๋,
public class TestClass {
@RepeatedTest(10)
void ํ
์คํธ1() { ... }
}
๐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ํ ์คํธ ๋ฉ์๋
csv ํ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ธฐ
@ParameterizedTest
@CsvSource({
"key1, 1",
"key2, 2",
"key3, 3",
})
void ํ
์คํธ(String key, int value) { ... }
csvํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ธฐ
@ParameterizedTest
@CsvFileSource(resources="/filename.csv")
void ํ
์คํธ(String key, int value) { ... }
์ธ์ ๊ฐ ์ธ ์ผ์ด ์์์ง๋.. ?
๐ ํ์๊ฐ์ ํ ์คํธ ์ฐ์ต
@MockBean(JpaMetamodelMappingContext.class)
@WebMvcTest(UserController.class)
@ExtendWith({MockitoExtension.class})
class UserControllerTest {
@MockBean
UserService userService;
@MockBean
UserDetailsServiceImpl userDetailsService;
@Autowired
MockMvc mockMvc;
@Test
@DisplayName("์ผ๋ฐ ํ์๊ฐ์
ํ
์คํธ")
void ์ผ๋ฐ_ํ์๊ฐ์
() throws Exception {
// Given
SignupRequestDto dto = SignupRequestDto.builder()
.username("test")
.password("password")
.reviewer(false)
.build();
// When
doReturn(new User(1L, dto.getUsername(), dto.getPassword(), UserRole.ROLE_USER, 0, new ArrayList<>()))
.when(userService).saveUser(dto);
Gson gson = new Gson();
// Then
mockMvc.perform(MockMvcRequestBuilders.post("/user/signup")
.contentType(MediaType.APPLICATION_JSON)
.content(gson.toJson(dto)))
.andDo(print())
.andExpectAll(
status().isOk(),
jsonPath("$.result").value("success")
);
}
}
์ฐธ๊ณ
https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฅ TIL - Day 56), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@dhk22/TIL-Day-56์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค