소프트웨어를 검사해 주어진 입력 내용과 기대되는 출력 내용 간 차이를 확인하는 과정
import org.junit.Test;
import static org.junit.Assert.*;
public class JunitSampleTest{ //Class 이름 끝에는 TEst를 붙여준다.
@Test //Test Annotation
public void testMethod(){ //Test Method
int sum = 10 + 20;
assertEquals(30, sum, 0); //TestCode
}
}
@Test
public void testCase1() throws Exception{
System.out.println("테스트 메소드를 지정함.");
}
Exception 처리
기대(예상)하는 Exception이 발생하는지를 테스트한다.
@Test(expected = IndexOutOfBoundsException.class)
public void testIsEmptyGetIndexOutOfBoundException(){
new ArrayList<Object>().get(0);
}
timeout
주어진 시간내에 정상적으로 실행이 되는지를 테스트 한다.
@Test(timeout=5000)
public void timeinMethodTest() throws InterruptedException{
Thread.sleep(3000);
}
@Test(timeout=5000)
public void timeinMethodTest() throws InterruptedException{
Thread.sleep(6000);
}
@BeforeClass
public static void setUpBeforeClass() throws Exception{
System.out.println("테스트 수행 전 한번만 실행 됨.");
}
@AfterClass
public static void setUpBeforeClass() throws Exception{
System.out.println("테스트 수행 후 한번만 실행 됨.");
}
@Before
public static void setUp() throws Exception{
System.out.println("테스트 케이스를 실행할 때마다 먼저 반복 실행 됨.");
}
@After
public static void tearDown() throws Exception{
System.out.println("테스트 케이스를 실행할 때마다 수행 후 반복 실행 됨.");
}
Method | 내용 |
---|---|
assertTrue(a) | a의 조건이 참이면 Pass |
assertFalse(a) | a의 조건이 참이면 Pass |
assertEquals(a, b) | a의 조건이 참이면 Pass |
assertSame(a, b) | a의 조건이 참이면 Pass |
assertNotNull(a) | a의 조건이 참이면 Pass |
assertArrayEquals(a, b) | a의 조건이 참이면 Pass |
Matcher 라이브러리 중 하나로 테스트 표현식 작성시 좀 더 자연스로운 문맥과 문장을 만들 수 있도록 지원한다. 가장 큰 장점은 오류 메시지를 읽기가 쉽다.
public class JunitHamcrestTest{
@Test
public void testMethod(){
ArrayList<Object> myList = new ArrayList<Object>();
assertThat(myList, is(empty()));
}
}
대역 배우(Stunt double)를 일컫는 단어에서 차용한 것으로 테스트의 의존성을 독립시킬 수 있도록 지원하는 대역 객체들을 지칭
Mock 객체를 만들어 테스트를 진행
자바에서 단위테스트를 하기 위해 Mock을 만들어주는 프레임워크
테스트 환경의 기능 확장이나 초기화를 위해 사용된다. Sring에서 좀 더 유연한 테스트를 위해서는 @RunWith(SpringJUnit4ClassRunner.class)를 사용한다.
@Test
public void studentMockTest(){
Student student = mock(Student.class);
assertTrue(student != null);
}
@Mock
Student student;
@Test
public void studentMockTest(){
MockitoAnnotations.initMocks(this);
assertTrue(student != null);
}
@Test
public void testStudentMockWhenTest(){
Student student = mock(Student.class);
when(student.getName()).thenReturn("카이사");
assertTrue("카이사".equals(student.getName()));
}
@Test(expected = IllegalArgumentException.class)
public void testStudentDoThrow(){
Student student = mock(Student.class);
doThrow(new IllegalArgumentException()).when(p).setName(eq("홍길동"));
p.setName(name);
}
@Mock
StudentService studentService;
@Test
public void testDoNothing(){
doNothing().when(studentService).getName(any());
studentService.getName(“르블랑");
}
public class StudentService {
private Student student;
public void addStudent(){
}
}
@Mock
Student student
@InjectMocks
StudentService studentService
@Test
public void testStudentServiceInjectMock(){
Student student = studentService.getStudent("애쉬");
AssertTrue(student.getPosition() == "바텀");
}
@Test
public void testStudentMockVerify(){
Student student = mock(Student.class);
student.setName("이즈리얼");
verify(student).setName("이즈리얼");
}
@Test
public void testStudentMockVerifyWithTimes(){
...
verify(student, times(1)).size(); //일반 verify와 같습니다. 1번 실행되었는지 확인
verify(student, atLeastOnce()).size(); // 최소 한 번 이상만 실행되면 OK
verify(student, atMost(2)).size(); // 최대 두번까지 실행되면 OK
verify(student, atLeast(3)).size(); // 최소 세 번은 실행되야 OK
verify(student, never()).clear(); // 절대 호출되면 안됨
verify(student, timeout(100).atLeast(1)).setName(any(String.class)); //100ms 시간 내에 한 번이상 실행되면 OK, setName에 오는 string은 아무거나 OK
}
BDD 기반으로 테스트하는 방법을 의미하며, 다음 예제와 같은 형식을 갖는다.
@Test
public void testPhoneBookInsertWhenIsEmpty(){
given(phoneBookRepository.contains(momContactName))
.willReturn(false);
phoneBookService.register(momContactName, momPhoneNumber);
then(phoneBookRepository).should().insert(momContactName, momPhoneNumber);
}