[Fixture Monkey 2ํ] validation ํ ์คํธ ํ๊ธฐ (w/ JPA Repository)
๐์ด์ ๊ธ
[Fixture Monkey] ํฝ์ค์ณ ๋ชฝํค๋ก ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ (Java Spring)
๐น ํ๊ฒฝ ์ค์
๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํฉ๋๋ค.
fixture-monkey-starter์ ์ด๋ฏธ ํฌํจ๋์ด์์ด ์ถ๊ฐํ์ง ์์๋ ๋ฉ๋๋ค.
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-jakarta-validation:1.0.0")
๐น ํ ์คํธ ์ฝ๋ ๋ง๋ค๊ธฐ
1. ํ ์คํธํ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
์๋ฏธ์๋ ๊ฐ์ฒด๋ก ํ ์คํธํ๋๊ฒ์ ์ฌ๋ฏธ์์ด, Entity ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ Repository ๊ธฐ๋ฅ์ด ์ ๋์ํ๋์ง ํ ์คํธํด๋ณด๊ฒ ์ต๋๋ค.
ํ ์คํธ๋ฅผ ์ํด DB ๋ฑ ์ค์ ์ด ํ์ํ๋ฐ, ์ด๋ ต๋ค๋ฉด @Entity๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฉํ์ ๋๋ฉ๋๋ค.
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@ToString
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@NotBlank
String name;
@NotNull
@Min(value = 10)
Integer price;
@NotNull
@PastOrPresent
Instant createdAt;
}
public interface BookRepository extends JpaRepository<Book, Long> {
}
2. Fixture Monkey ์์ด ํ ์คํธ
ํ ์คํธํ๊ณ ์ ํ๋ ๊ด์ฌ ๊ธฐ๋ฅ์ด ์ฌ๋ฟ ํฌํจ๋ ํ ์คํธ์ด์ง๋ง, Validation ๊ด์ ์์ ์ถฉ๋ถํ ํ ์คํธ ํ ์ ์์๊ฒ ๊ฐ์ ์๋์๊ฐ์ด ์์ฑํด๋ณด์์ต๋๋ค.
Validation์ ํฉ๋นํ ๊ฐ์ด ๋ค์ด์ค๋ฉด ๋ก์ง์ด ๊ธฐ๋ํ๋๋ฐ๋ก ์ํ๋๊ณ , ๊ทธ๋ ์ง ๋ชปํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
@DataJpaTest
class BookRepositoryTest {
@Autowired
BookRepository bookRepository;
@Test()
void ์ผ๋ฐ_ํ
์คํธ() {
Book book = Book.builder()
.id(1L)
.name("ํ
์คํธ์ฉ์ฑ
")
.price(10000)
.createdAt(Instant.now().minus(1, ChronoUnit.DAYS))
.build();
bookRepository.save(book);
Book savedBook = bookRepository.findById(1L).orElseThrow(EntityNotFoundException::new);
assertThat(savedBook).usingRecursiveComparison()
.ignoringFields("createdAt")
.isEqualTo(book);
assertThat(savedBook.getCreatedAt()).isCloseTo(book.getCreatedAt(), within(3, ChronoUnit.SECONDS));
}
@Test()
void ์ผ๋ฐ_์คํจ_ํ
์คํธ() {
Book book = Book.builder()
.id(1L)
.name("ํ
์คํธ์ฉ์ฑ
")
.price(1) // exception
.createdAt(Instant.now().minus(1, ChronoUnit.DAYS))
.build();
assertThatThrownBy(() -> bookRepository.save(book))
.isInstanceOf(ConstraintViolationException.class);
}
}
3. Fixture Monkey๋ฅผ ์ด์ฉํ ํ ์คํธ
์๋ ์ฝ๋๋ ๊ฐ์ฒด ์์ฑ์ Fixture Monkey์๊ฒ ์์ํ์ต๋๋ค. ๋๋คํ๊ฒ ์์ฑ๋๋ค๋ ํน์ง ๋๋ฌธ์ @Test๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ณตํ์ฌ ์ฑ๊ณตํ๋์ง ํ์ธํ๊ณ ์ @RepeatedTest๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
@DataJpaTest
class BookRepositoryTest {
@Autowired
BookRepository bookRepository;
@RepeatedTest(5)
void Fixture_Monkey_ํ
์คํธ() {
FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
.plugin(new JakartaValidationPlugin())
.build();
Book book = fixtureMonkey.giveMeOne(Book.class);
Book savedBook = bookRepository.save(book);
System.out.println(savedBook);
assertThat(Validation.buildDefaultValidatorFactory()
.getValidator()
.validate(savedBook))
.isEmpty();
}
}
ํ ์คํธ๋ ๋ชจ๋ ์ฑ๊ณตํ๋ฉฐ print ์ ๋ค์ํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ฒ์ ํ์ธํ์ต๋๋ค.
์ฌ์ฉ๋ฒ๋ ์ฝ๊ณ ์์์ ๋ค ํด์ฃผ๋ ๋ง์กฑ์ค๋ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Fixture Monkey] ํฝ์ค์ณ ๋ชฝํค๋ก ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ (Java Spring) (2) | 2023.11.24 |
---|---|
[WebClient] Spring์์ API ํธ์ถํ๊ธฐ (0) | 2022.04.07 |