2023. 3. 24. 19:02ใ๐พBackEnd/๐ฑ Spring
Mockito - mockito-core 5.2.0 javadoc
Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 5.2.0 https://javadoc.io/doc/org.mockito/mockito-core/5.2.0 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.m
javadoc.io
Mockito๋?
Mock์ ์ฝ๊ฒ ๋ง๋ค๊ณ mock์ ํ๋์ ์ ํ๋ stubbing ๋ก์ง์ด ์คํ์ด ๋์๋์ง ํ์ธํ๊ธฐ ์ํ verify()๋ฅผ ์ด์ฉ์ด ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ ์ ๋๋ค.
Stubbing์ด๋
๋ชจ์ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ์ ๋ํ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ํ์ฌ ๋ฐํ์ ํฉ๋๋ค. ์ฆ. ํ ์คํธ ์ฝ๋์์ ๋ชจ๋ธ ๊ฐ์ฒด๊ฐ ํธ์ถ๋ ๋ ์ด๋ค ๊ฐ์ ๋ฐํํด์ผ ํ๋์ง๋ฅผ ๋ฏธ๋ฆฌ ์ ํด๋๋ ๊ฒ์ด๋ค.
public interface MyService {
String getName();
}
@Test
public void testMyService() {
MyService myService = mock(MyService.class);
when(myService.getName()).thenReturn("Mockito");
String name = myService.getName();
assertEquals("Mockito", name);
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด when().thenReturn()์ ํตํด ๊ฐ์ ๋ฐํ์ ํ ์ ์๊ฒ ํฉ๋๋ค.
๊ทธ๋์ service์ getName()์ ์คํํ๋ฉด ์์ ์ค์ ํ Mockito๊ฐ ํธ์ถ์ด ๋ฉ๋๋ค.
Mock์ด๋
๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์๋ฏธ ํฉ๋๋ค. ์ฃผ๋ก ํ ์คํธ์์ ์ฌ์ฉ๋๋ฉฐ ํ ์คํธํ ๋ ํ์ํ ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ผํ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ํ ์คํธ๋ฅผ ํ ๋ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด ์ค๋๋ค.
๋ชจ์ ๊ฐ์ฒด - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . -->
ko.wikipedia.org
์์ ์ฌ์ดํธ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋์ด ์๋ค.
๊ทธ๋ฌ๋ฉด ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ํ ์ฅ์ ์ด ์์๊น?
๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด DB์์ ๊ฐ์ ์ฝ์ด์ค์ง ์์ต๋๋ค. ์ฆ. DB์ ์ฐ๊ฒฐ์ ํ์ง ์๋๋ค.
ํ ์คํธ์ ๊ด์ ์์ ๋ณด๊ฒ๋๋ฉด DB์ ์ฐ๊ฒฐ์ ํ๋ฉด ์ํํฉ๋๋ค.
๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด DB์ ์ฐ๊ฒฐ์ด ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋งค๋ฒ ์์ ์ ํ๋ฉด DB์ ์ฐ๋์ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํ ์คํธ์ ์๊ฐ์ด ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ์ค๋ช ์ ํ๊ฒ ์ต๋๋ค.
@SpringBootTest
class OwnerServiceTest2 {
@Autowired
private OwnerService ownerService;
@Autowired
private OwnerRepository ownerRepository;
@BeforeEach
void setUp() {
List<Owner> ownerList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Owner owner = Owner.builder()
.name("owner" + i)
.build();
Item item = Item.builder()
.name("item" + i)
.build();
owner.addItem(item);
ownerRepository.save(owner);
}
}
@Test
@DisplayName("findAll()๋ก N+1๋ฌธ์ ๊ตฌํ")
public void findAllWith_N1_Invalid() {
this.ownerService.findAll();
}
}
์์ ์ฝ๋๋ MOCK์ ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ์ฝ๋์ ๋๋ค. ์ด ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ฉด DB์ ์ฐ๊ฒฐ์ ํตํด ๊ฐ์ ์ ์ฅํ๊ณ ๊ฐ์ ์ฝ์ต๋๋ค.
์ด์ Mock์ ์ด์ฉํด์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑ์ ํ๊ฒ ์ต๋๋ค.
1. ์์กด์ฑ ์ถ๊ฐ
dependencies {
testImplementation 'org.mockito:mockito-core:3.11.2'
testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2'
}
2. ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ
class OwnerServiceTest {
private OwnerService ownerService;
private final OwnerRepository ownerRepository = mock(OwnerRepository.class);
@BeforeEach
void setUp() {
ownerService = new OwnerService(ownerRepository);
List<Owner> ownerList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Item build = Item.builder()
.name("์์ดํ
" + i)
.build();
Owner owner = Owner.builder()
.name("๊น๋ฌด๊ฑด"+i)
.items(List.of(build))
.build();
ownerList.add(owner);
}
given(ownerRepository.findAll()).willReturn(ownerList);
}
@Test
@DisplayName("findAll")
public void findAllWithValid() throws Exception {
// when
List<String> actualOwners = ownerService.findAll();
// then
actualOwners.forEach(i->{
System.out.println("i = " + i);
});
}
}
ํ ์คํธ ์ฝ๋๋ฅผ ์คํ์ ํด๋ณด๋ฉด DB์ ์ฐ๊ฒฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ์ DB์ ๊ฐ์ด ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
Mock๊ณผ Spy์ ๋ํด ๋น๊ตํ์
Mock๊ณผ Spy๋ ๋ชจ๋ Mockito์์ ์ ๊ณตํ๋ ๋ชฉ ๊ฐ์ฒด(Mock Object)๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ ์ค ๋ ๊ฐ์ง์
๋๋ค. ํ์ง๋ง Mock๊ณผ Spy๋ ๋ชฉ์ ์ด ๋ค๋ฅด๋ฏ๋ก ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
Mock ๊ฐ์ฒด๋ ์์ ํ ๊ฐ์ง ๊ฐ์ฒด๋ก, ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ์ ๊ฐ์ํ๊ณ ๊ธฐ๋ํ๋ ๋์์ ์ํํฉ๋๋ค. ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ฒดํ์ฌ ํ
์คํธํ๊ธฐ ๋๋ฌธ์, ํน์ ํ ๊ธฐ๋ฅ์ ๋ฉ์๋๋ฅผ ํธ์ถํ์์ ๋ ๊ธฐ๋ํ ๋๋ก์ ๋ฐํ๊ฐ์ ๋ฐ์์ฌ ์ ์๋์ง, ๋ฉ์๋๊ฐ ์ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋์ง ๋ฑ์ ๊ฒ์ฆํ ๋ ์ฌ์ฉํฉ๋๋ค. Mock ๊ฐ์ฒด๋ Mockito์์ ์ ๊ณตํ๋ mock() ๋ฉ์๋๋ @Mock ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
Spy ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ผ๋ถ๋ถ์ ๋์ ํ๋ ๊ฐ์ฒด๋ก, ์ค์ ๊ฐ์ฒด์ ๋์์ ์ ์งํ๋ฉด์ ์ผ๋ถ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ํน์ ํ ๊ฐ์ฒด์ ์ผ๋ถ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง Mock ๊ฐ์ฒด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ง, ๊ทธ ์ธ์๋ ์ค์ ๊ฐ์ฒด์ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. Spy ๊ฐ์ฒด๋ Mockito์์ ์ ๊ณตํ๋ spy() ๋ฉ์๋๋ @Spy ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Mock ๊ฐ์ฒด๋ ์์ ํ ๊ฐ์ง ๊ฐ์ฒด๋ก ๊ฐ์ฒด์ ์ผ๋ถ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ, Spy ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด์ ์ผ๋ถ๋ถ์ ๊ฐ์ง๋ก ๋ง๋ค์ด์ ์ฌ์ฉํฉ๋๋ค. ๋ณดํต Mock ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ๋ฉ์๋ ํธ์ถ์ ๊ฒ์ฆํ๊ฑฐ๋, ๊ฐ์ฒด์ ๋์์ ์์ธกํ๋๋ฐ ์ฌ์ฉํ๋ฉฐ, Spy ๊ฐ์ฒด๋ ์ค์ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํฉ๋๋ค.
Mockito๋? Mockito ์ฌ์ฉํ๊ธฐ
Mockito๋? · Mock ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ , ๊ด๋ฆฌํ๊ณ , ๊ฒ์ฆํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ - Mock: ์ง์ง ๊ฐ์ฒด์ ๋น์ทํ๊ฒ ๋์ํ์ง๋ง, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํ๋์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด - ๊ณตํ https://site.m
scshim.tistory.com
Mockito ๊ณต๋ถํ๊ธฐ #1
Mockito Docs๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ ์์ฑํ๋ ์ฒซ ๋ฒ์งธ ๊ฒ์๊ธ์ ๋๋ค. ๋ ๋ฒ์งธ ๊ฒ์๊ธ ๋ฐ๋ก๊ฐ๊ธฐ Mockito๋? Mockito๋ Mock Object๋ฅผ creation, verification, stubbing ํด์ฃผ๋ JAVA์์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋
sun-22.tistory.com
'๐พBackEnd > ๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
N+1 ๋ฌธ์ ๋ค์ํ ํด๊ฒฐ๋ฒ (0) | 2023.12.15 |
---|---|
[ Swagger ] Swagger UI๋ฅผ ํตํด API ๋ช ์ธ์ Postman ๊ณต์ (0) | 2023.04.21 |
์ํธํ Bcrypt์ ๋ํ ์ฌ์ธต ๋ถ์ (2) | 2023.03.24 |
[ Object Mapper] Dozer์ ๋ํด์ ๋ค์ด๋ ๋ดค๋? (0) | 2023.03.14 |
[ RFC ] ๊ณต์ ๋ฌธ์๋ฅผ ํตํ์ฌ Delete์ Status๋ฅผ ์์๋ณด์ (0) | 2023.03.12 |