ν μ€νΈμ μ’ λ₯, μ€νλ§ ν μ€νΈ νλ μμν¬
μ€νλ₯΄ν μ½λ© ν΄λ½μ Spring μ¬νλ° 3μ£Ό μ°¨ λ΄μ©μΈ ν
μ€νΈμ μ’
λ₯, μ€νλ§ ν
μ€νΈ νλ μμν¬
μ μ 리νλ€.
ν΅μ¬ λ΄μ©
- ν μ€νΈμ μ’ λ₯
- μ€νλ§ ν μ€νΈ νλ μμν¬ μ΄ν΄ & μ¬μ©
ν μ€νΈμ μ’ λ₯ & νμμ±
- λΈλλ°μ€ ν
μ€νΈ : λ΄λΆμ ꡬ쑰 λ° λμ μ리λ₯Ό λͺ¨λ₯΄λ λΈλλ°μ€μ κ°μ μν(μλΉμ€μ μ¬μ©μ μ
μ₯)μμ λμμ κ²μ¬νλ ν
μ€νΈ λ°©λ²
- μ₯μ : λꡬλ ν μ€νΈ κ°λ₯
- λ¨μ : κΈ°λ₯μ΄ μΆκ°λ μλ‘ ν μ€νΈμ λ²μκ° λμ΄λκ³ ν μ€νΈνλ μ¬λμ΄ λμ΄λμΌ νλ€.
- κ°λ°μ ν
μ€νΈ : κ°λ°μκ° μμ±ν μ½λλ₯Ό κ²μ¦ν΄ μ£Όλ ν
μ€νΈ μ½λλ₯Ό μ§μ μμ±νλ λ°©λ²
- μ₯μ : λΉ λ₯΄κ³ μ νν ν μ€νΈ, μλν κ°λ₯, κΈ°μ‘΄ μ½λκ° μ λμνλμ§ νμΈν μ μμ, λ°°ν¬ μμ νμ κ²μ¦μ΄ κ°λ₯νλ€.
- λ¨μ : κ°λ° μκ°μ΄ μ€λ κ±Έλ¦¬κ³ , ν μ€νΈ μ½λμ μ μ§ λ³΄μ λΉμ©μ΄ λ λ€.
- μ€νλ§μμ
JUnit
μ μ΄μ©ν λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈκ° μλ€.
μ€νλ§ ν μ€νΈ νλ μμν¬ μ΄ν΄ & μ¬μ©
λ¨μ ν μ€νΈ
- νλ‘κ·Έλ¨μ μμ λ¨μ(ν΄λμ€, λͺ¨λ, λ©μλ λ±..)μΌλ‘ μͺΌκ°μ κ° λ¨μκ° μ νν λμνλμ§ κ²μ¬νλ ν μ€νΈ
- μ€νλ§μμ μλ° νλ‘κ·Έλλ° μΈμ΄μ© λ¨μ ν
μ€νΈ νλ μμν¬μΈ
JUnit
μ μ¬μ©νμ¬ λ¨μ ν μ€νΈλ₯Ό μ€ννλ€. - ν
μ€νΈλ₯Ό μνλ ν΄λμ€, λ©μλλ₯Ό μν νμΌμ λ§λ ν, ν
μ€νΈν λ©μλμ
@Test
,@DisplayName("...")
λ±μ μ΄λ Έν μ΄μ μ λΆμΈλ€. - μμ μ΄λ
Έν
μ΄μ
μ΄ λΆμ¬μ Έ μλ λ©μλμ
Run 'ν΄λΉ λ©μλ()'
μ κΈ°λ₯μ μ€ννλ©΄ ν μ€νΈκ° μ€νλλ€. - ν μ€νΈ μ½λλ λ³΄ν΅ given(μ£Όμ΄μ§ μν©), when(ν μ€νΈλ₯Ό μν μ€ν), then(κ²°κ³Ό)λ‘ λλ μ μμ±νλ€.
- κ²°κ΄κ°μ
assertNull
,assertEquals
,assertFalse
λ±μ λ©μλμ νλΌλ―Έν°λ₯Ό λ£μ΄ νμΈνλ€. - μμΈ μ²λ¦¬μ κ²½μ°μ λ€μκ³Ό κ°μ΄ νμΈνλ€.
// μμΈμ²λ¦¬ example
// when
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
new Product(requestDto, userId);
});
// then
assertEquals("μν μ΅μ κ°κ° 0 μ΄νμ
λλ€.", exception.getMessage());
@Nested
: ν΄λμ€ μμ ν΄λμ€λ₯Ό λ£μ μ μκ² ν΄μ£Όλ μ΄λ Έν μ΄μ μΌλ‘ ν μ€νΈ μ½λ κ²°κ³Όλ₯Ό νμΈν λ νμ κ΅¬μ‘°λ‘ νμλλ€.
TDD(Test-Driven Development)
κΈ°μ‘΄μ μμμΈ
μ€κ³ -> κ°λ° -> ν μ€νΈ (-> μ€κ³ μμ )
μ μμλ₯Ό
μ€κ³ -> ν μ€νΈ (->μ€κ³ μμ ) -> κ°λ°
λ‘ λ³κ²½νμ¬ κ°λ°νλ λ°©λ²
μ¦, κ°λ°μ λ¨Όμ νκΈ° μ μ ν μ€νΈ μ½λλ₯Ό λ§λ ν ν μ€νΈ μ½λλ₯Ό ν΅κ³Όν μ μλλ‘ κ°λ°νλ λ°©μμ΄λ€.
Mock object (κ°μ§ κ°μ²΄)
λ¨μ ν μ€νΈμμ κ° ν μ€νΈ μΌμ΄μ€λ μλ‘ λΆλ¦¬λλ κ²μ΄ μ΄μμ μ΄κΈ° λλ¬Έμ κ°μ§ κ°μ²΄λ₯Ό μμ±νμ¬ μ¬μ©νλ€.
- λμΌν ν΄λμ€λͺ κ³Ό λ©μλλͺ μ¬μ©
- Mock κ°μ²΄μ λ΄λΆ λ‘μ§μ μ€μνμ§ μλ€.
- κ°λ°μκ° Mock object ν¨μλ₯Ό ν μ€νΈ μλλ¦¬μ€ λ³λ‘ μ€μ μ΄ κ°λ₯νλ€.
Mockito mockμ μ΄μ©ν λ¨μ ν μ€νΈ
κ°λ°μκ° μΌμΌμ΄ Mock objectλ₯Ό ꡬνν μ μκΈ° λλ¬Έμ Mockitoλ₯Ό μ¬μ©νμ¬ λ¨μ ν μ€νΈλ₯Ό λ§λ€κ³ ν¨μλ₯Ό ν μ€νΈ μλλ¦¬μ€ λ³λ‘ μ€μ νλ€.
μμ
@Mock
μ΄λ Έν μ΄μ μ λΆμ¬ ν΄λΉ κ°μ²΄κ° Mock object μμ λͺ μνλ€.when
,thenReturn
λ©μλλ₯Ό νμ©ν΄ μλ리μ€λ₯Ό μ€μ νλ€.
λͺ© μ€λΈμ νΈ
μ μ μ : μ¬μ©μμ νμλ₯Ό 쑰건λΆλ‘ μ¬μ μ μ λ ₯ν΄λλ©΄, κ·Έ μν©μ μμ λ νμλ₯Ό μννλ κ°μ²΄
@ExtendWith(MockitoExtension.class)
class ProductServiceTest {
@Mock
ProductRepository productRepository;
// μλ΅ ...
when(productRepository.findById(productId))
.thenReturn(Optional.of(product));
}
ν΅ν© ν μ€νΈ
- λͺ¨λ κ°μ μνΈ μμ© κ²μ¦μ λͺ»νλ λ¨μ ν μ€νΈμ νκ³λ₯Ό 극볡νκΈ° μν΄ ν΅ν© ν μ€νΈλ₯Ό μ€ν
- λ κ° μ΄μμ λͺ¨λμ΄ μ°κ²°λ μνμμ ν
μ€νΈνλ©°, λͺ¨λ κ°μ μ°κ²°μμ λ°μνλ μλ¬λ₯Ό κ²μ¦νλ€.
- ex) Controller -> Service -> Repositoryκ° μ°κ²°λ νλμ ν΅ν©λ ν μ€νΈλ₯Ό μν
@SpringBootTest
: μ€νλ§ λΆνΈκ° μ 곡νλ ν μ€νΈ μ΄λ Έν μ΄μ μΌλ‘, μ€νλ§ IoC, DB CRUDλ₯Ό μ¬μ©νκΈ° μν΄μ μ μΈν΄μ€μΌ νλ€.@Order(N)
: νλΌλ―Έν° μμ μ«μλ₯Ό λ£μ΄ ν μ€νΈμ μμλ₯Ό μ ν μ μλ μ΄λ Έν μ΄μ
'Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring AOP, νΈλμμ , μμΈ μ²λ¦¬ (0) | 2022.03.17 |
---|---|
μ€νλ§ JPA, νμ΄μ§, μ°κ΄κ΄κ³ (0) | 2022.03.17 |
μΈμ¦, μΈκ°, μΏ ν€, μΈμ , OAuth2 (0) | 2022.03.16 |
Springμ DI, IoC 컨ν μ΄λ, μ€νλ§ κ³μΈ΅κ΅¬μ‘° (0) | 2022.03.16 |
@ControllerAdviceλ₯Ό μ΄μ©ν μμΈ μ²λ¦¬ (0) | 2022.03.16 |