Search
Duplicate

mockito

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
๋ณต์‚ฌ