Mockito๋?
โข
Mockito๋ ๋จ์ ํ
์คํธ๋ฅผ ์ํด ๋ชจ์ ๊ฐ์ฒด(Mock Object)๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ Java ์คํ์์ค ํ๋ ์์ํฌ์ด๋ค.
โข
์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ๊ฐ์ฒด์ ๋์์ ๋ชจ๋ฐฉํ๋ ๋ชจ์ ๊ฐ์ฒด(Mock Object)๋ฅผ ์์ฑํ์ฌ ์ฝ๋์ ํน์ ๋ถ๋ถ์ ๊ฒฉ๋ฆฌ์ํค๊ณ ํ
์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค.
Mockito๋ฅผ ์ด์ฉํ ํ ์คํธ์ ๋ชฉ์
โข
๋ชจ์ ๊ฐ์ฒด์ ํจ๊ป ์๋น์ค๋ฅผ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๊ฐ ๋๋์ง ํ์ธํ๊ธฐ ์ํด ํ
์คํธ๋ฅผ ์ํํ๋ค.
โข
์ด๋ฌํ ํ
์คํธ ๊ณผ์ ์ ํตํด ์๋น์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ํด ๊ฒ์ฆํ๊ณ ์์ธ ์ํฉ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ์ธํ๋ค.
Mockito์ ์ฃผ์ ๊ธฐ๋ฅ
โข
Stubbing
โฆ
ํน์ ๋ฉ์๋๊ฐ ํธ์ถ๋์์ ๋ ์ํ๋ ๊ฐ์ ๋ฐํํ๋๋ก ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋ค.
@Test
public void testStubbing() {
// List ์ธํฐํ์ด์ค์ Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
List mockList = Mockito.mock(List.class);
// mockList.get(0)์ด ํธ์ถ๋๋ฉด "first"๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํ๋ค.
when(mockList.get(0)).thenReturn("first");
// mockList.get(0)์ ๊ฒฐ๊ณผ๊ฐ "first"์ธ์ง ๊ฒ์ฆํ๋ค.
assertEquals("first", mockList.get(0));
}
Java
๋ณต์ฌ
โข
Verification
โฆ
ํน์ ๋ฉ์๋๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ํธ์ถ๋์๋์ง ๊ฒ์ฆํ๋ค.
@Test
public void testVerification() {
// List ์ธํฐํ์ด์ค์ Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
List mockList = Mockito.mock(List.class);
// Mock ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
mockList.add("one");
// mockList.add("one")์ด ํธ์ถ๋์๋์ง ๊ฒ์ฆํ๋ค.
verify(mockList).add("one");
}
Java
๋ณต์ฌ
โข
Argument Matchers
โฆ
๋ฉ์๋ ํธ์ถ ์ ๊ธฐ๋ํ๋ ์ธ์์ ๊ฐ์ ์ค์ ํ๋ค.
@Test
public void testArgumentMatchers() {
// List ์ธํฐํ์ด์ค์ Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
List mockList = Mockito.mock(List.class);
// mockList.get()์ด ํธ์ถ๋๋ฉด "element"๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํ๋ค. anyInt()๋ ์์์ ์ ์๋ฅผ ์๋ฏธ.
when(mockList.get(anyInt())).thenReturn("element");
// mockList.get(0)๊ณผ mockList.get(999)์ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ "element"์ธ์ง ๊ฒ์ฆํ๋ค.
assertEquals("element", mockList.get(0));
assertEquals("element", mockList.get(999));
}
Java
๋ณต์ฌ
โข
Spying
โฆ
์ค์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์ผ๋ถ ๋ฉ์๋๋ง ๊ฐ์ง๋ก ๋์ํ๊ฒ ์ค์ ํ๋ค.
@Test
public void testSpying() {
// ์ค์ LinkedList ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
List<String> list = new LinkedList<>();
// LinkedList ๊ฐ์ฒด๋ฅผ ์ด์ฉํด Spy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
List<String> spy = spy(list);
// Spy ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
spy.add("one");
spy.add("two");
// spy.add("one")๊ณผ spy.add("two")๊ฐ ํธ์ถ๋์๋์ง ๊ฒ์ฆํ๋ค.
verify(spy).add("one");
verify(spy).add("two");
// spy.size()์ ๊ฒฐ๊ณผ๊ฐ 2์ธ์ง ๊ฒ์ฆํ๋ค.
assertEquals(2, spy.size());
// spy.size()๊ฐ ํธ์ถ๋๋ฉด 100์ ๋ฐํํ๋๋ก ์ค์ ํ๋ค.
when(spy.size()).thenReturn(100);
// spy.size()์ ๊ฒฐ๊ณผ๊ฐ 100์ธ์ง ๊ฒ์ฆํ๋ค.
assertEquals(100, spy.size());
}
Java
๋ณต์ฌ
Mockito ์ฌ์ฉ ๋ฐฉ๋ฒ
1.
@RunWith(MockitoJUnitRunner.class) ์ด๋
ธํ
์ด์
์ ํ
์คํธ ํด๋์ค์ ์ถ๊ฐ.
2.
Mock ๊ฐ์ฒด ์์ฑ : @Mock ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
3.
Spy ๊ฐ์ฒด ์์ฑ : @Spy ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ์ค์ ๊ฐ์ฒด๋ฅผ ์คํ์ด ๊ฐ์ฒด๋ก ๋ง๋ ๋ค.
4.
์์กด์ฑ ์ฃผ์
: @InjectMocks ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด Mock ๊ฐ์ฒด๋ Spy ๊ฐ์ฒด๋ฅผ ํ
์คํธ ๋์ ๊ฐ์ฒด์ ์ฃผ์
ํ๋ค.
5.
Stubbing : ๊ฐ์ง ๊ฐ์ฒด์ ๋์์ ์ค์ ํ๋ค.
6.
Verification : ๋ฉ์๋ ํธ์ถ์ ๊ฒ์ฆํ๋ค.
โข
UserService ํด๋์ค์ UserRepository ์ธํฐํ์ด์ค๊ฐ ์๋ค๊ณ ๊ฐ์ .
โข
UserService๋ UserRepository๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ getUser ๋ฉ์๋์ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ createUser ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUser(String id) {
return userRepository.findById(id);
}
public void createUser(User user) {
userRepository.save(user);
}
}
Java
๋ณต์ฌ
โข
UserService ์ ๋ฉ์๋๋ค์ ํ
์คํธํ๊ธฐ ์ํ Mockito ์ฌ์ฉ ์์
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private UserRepository mockRepository; // UserRepository์ Mock ๊ฐ์ฒด ์์ฑ
@InjectMocks
private UserService userService; // UserService ๊ฐ์ฒด ์์ฑ ํ, Mock ๊ฐ์ฒด ์ฃผ์
@Test
public void testGetUser() {
// ๊ฐ์ง ๊ฐ์ฒด์ findById ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ํน์ User ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ์ค์ (Stubbing))
User expectedUser = new User("1", "John");
when(mockRepository.findById("1")).thenReturn(expectedUser);
// getUser ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ฐํ๊ฐ์ ๊ฒ์ฆ (Verification)
User resultUser = userService.getUser("1");
assertEquals(expectedUser, resultUser);
verify(mockRepository).findById("1");
}
@Test
public void testCreateUser() {
User newUser = new User("2", "Jane");
// createUser ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ์๋์ง ๊ฒ์ฆ (Verification)
userService.createUser(newUser);
verify(mockRepository).save(newUser);
}
}
Java
๋ณต์ฌ




