[Spring] JUnit 2
1. @Test(Expected=...)
실행결과에 대한 테스트 뿐만이 아닌 에러에 대한 테스트또한 가능하다.
특정 예외처리에 반응하여 아래와 같이 정의할수 있다.
@Test(expected=EmptyResultDataAccessException.class)
public void getUserFailure() throws SQLException {
...
}
위의 코드는 EmptyResultDataAccessException 예외가 나와야지만 해당 테스트가 성공적으로 이루어진다.
2. @Before
테스트할 메소드들의 공통적인 관심사를 따로 추출하여 테스트를 진행할수 있다.
@Before 어노테이션을 사용하면 테스트를 진행하기 전에 @Before 메소드 안에있는 기능이 실행하게 된다.
private UserDao userdao;
private User user1;
private User user2;
private User user3;
@Before
public void setUp() {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
this.userdao = context.getBean("userDao", UserDao.class);
this.user1 = new User("UNIQUE_ID1", "test1", "springTest1");
this.user2 = new User("UNIQUE_ID2", "test2", "springTest2");
this.user3 = new User("UNIQUE_ID3", "test3", "springTest3");
}
위의 코드는 userdao와 user 변수 3개를 전역변수로 두고 값 초기화를 @Before 메소드안에 정의하였다.
3. JUnit architecture
JUnit은 완벽한 테스트를 위해 @Test 어노테이션이 붙은 메소드를 찾아서 메소드하나당 오브젝트를 별도로 생성하여 테스트를 진행하여준다.
그런데 지금까지 작성했던 코드는 bean를 정의하여 DataSource의 getConnection를 가져오고 있었다.
bean을 정의하면 스프링은 싱글톤 레지스트리에 적재하게 되는데.
JUnit이 생성할때는 각각의 bean아예 다르다는걸 위의 출력에서 확인할수 있다.
즉 bean의 자원을 공유하여 서로 다른 테스트 메소드를 같이 비교하려할때는 불가능하며 그렇게 만들어서는 안된다는거다.
JUnit의 하나의 테스트 클래스를 가져와 테스트를 수행하는 방식은 다음과 같다.
1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메소드를 모두 찾는다.
2. 테스트 클래스의 오브젝트를 하나 만든다.
3. @Before이 붙은 메소드가 있으면 실행한다.
4. @Test가 붙은 메소드를 하나 호출하고 테스트결과를 저장해둔다.
5. @After이 붙은 메소드가 있으면 실행한다.
6. 나머지 테스트 메소드에 대해 2~5번을 반복한다.
7. 모든 테스트의 결과를 종합해서 돌려준다.
이 글은 작년에 작성한 글이라 가장 최근에 정리한 글이 있음
2020/07/28 - [Develop/Test Framework] - Java Test 프레임워크
Java Test 프레임워크
Test 1. 개요 2. 테스트란? 3. Junit4, assertj, Mockito 소개 및 사용법 4. Spring test 모듈 5. controller, service, dao 테스트 개요 테스트에 대한 개념과 중요성을 알고 각종..
tony950620.tistory.com