namkyu
8/7/2013 - 4:48 AM

MockitoTest.java

package mockito;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import lombok.Data;

import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

/**
 * @FileName : MockitoTest.java
 * @Project : test_project
 * @Date : 2013. 8. 1.
 * @작성자 : 이남규
 * @프로그램설명 :
 */
public class MockitoTest {

  /**
	 * <pre>
	 * verifyTest
	 * verify 테스트
	 * <pre>
	 */
	@Test
	public void verifyTest() {
		@SuppressWarnings("unchecked")
		List<String> testMock = mock(ArrayList.class);
		testMock.add("1");
		testMock.add("2");
		testMock.add("3");

		// add()가 최소한 1번 이상 호출되었는지 검증
		verify(testMock, atLeastOnce()).add(anyString());

		// add()가 최소한 3번 이상 호출되었는지 검증
		verify(testMock, atLeast(3)).add(anyString());

		// add()가 최대한 3번 이하 호출되었는지 검증
		verify(testMock, atMost(3)).add(anyString());

		// add()가 3번 호출되었는지 검증
		verify(testMock, times(3)).add(anyString());

		verify(testMock, times(1)).add("1"); // add("1")가 1번 호출되었는지 검증
		verify(testMock, times(1)).add("2"); // add("2")가 1번 호출되었는지 검증
		verify(testMock, times(1)).add("3"); // add("3")가 1번 호출되었는지 검증

		// add("4")가 수행되지 않았는지를 검증
		verify(testMock, never()).add("4");
	}

	/**
	 * <pre>
	 * whenThenTest
	 * when절에 해당하는 함수를 호출할 경우 then절에 정의된 내역을 반환
	 * <pre>
	 */
	@Test
	public void whenThenTest() {
		@SuppressWarnings("unchecked")
		Map<String, String> testMock = mock(Map.class);

		// 만약 testMock.get("name1")를 호출하면 kyu1 이라는 값을 return한다는 의미로써
		// testMock.put("name1", "kyu1")을 한 것과 같은 의미로 생각하면 된다.
		when(testMock.get("name1")).thenReturn("kyu1");
		when(testMock.get("name2")).thenReturn("kyu2");
		when(testMock.get("name3")).thenReturn("kyu3");

		assertThat("kyu1", is(testMock.get("name1")));
		assertThat("kyu2", is(testMock.get("name2")));
		assertThat("kyu3", is(testMock.get("name3")));
	}

	/**
	 * <pre>
	 * whenThenthrowtest
	 *
	 * <pre>
	 */
	@Test(expected = RuntimeException.class)
	public void whenThenthrowtest() {
		@SuppressWarnings("unchecked")
		Map<String, String> testMock = mock(Map.class);

		// get("name4")를 호출하면 RuntimeException 발생
		when(testMock.get("name4")).thenThrow(new RuntimeException());
		assertThat(testMock.get("name4"), is(RuntimeException.class));
	}

	/**
	 * <pre>
	 * whenThenAnswerTest
	 *
	 * <pre>
	 */
	@Test
	public void whenThenAnswerTest() {
		UserDAO userDAO = mock(UserDAO.class);

		when(userDAO.getUser("kyuId")).thenAnswer(new Answer<User>() {
			@Override
			public User answer(InvocationOnMock invocation) throws Throwable {
				User user = new User();
				user.setUserId("kyuId");
				user.setName("남규");
				user.setAge(32);
				return user;
			}
		});

		User user = userDAO.getUser("kyuId");
		assertThat("kyuId", is(user.getUserId()));
		assertThat("남규", is(user.getName()));
		assertThat(32, is(user.getAge()));
	}

}

class UserDAO {
	public User getUser(String userId) {
		return new User();
	}
}

@Data
class User {
	private String userId;
	private String name;
	private int age;
}