책책책/토비의 스프링 3.1

[Spring] 자바 테스팅 프레임워크 JUnit (기본편)

Deveun 2021. 7. 20. 02:32

토비의 스프링 2장: 테스트

JUnit (자바 테스팅 프레임워크)

지난 게시글에서는 JUnit 단위테스트를 왜 쓰는지, 어떻게 쓰는지에 대해서 기본 개념을 알아보았다.

(이전게시글 참고: 2021.07.16 - [책책책/토비의 스프링 3.1] - [Spring] 자바 테스팅 프레임워크 JUnit (개념편))

어플리케이션 코드 뿐만이 아니라 테스트 코드도 리팩토링이 필요한데, JUnit의 기능들을 사용하며 이전 게시글에서 작성했던 코드를 개선해보자.

 

1) 반복적인 코드를 제거

: @Before / @After 어노테이션을 메소드에 써주면 각각의 @Test 메소드의 테스트 전 / 후에 공통기능들을 자동으로 호출하여 수행한다.

단, 자동으로 호출되기 때문에, 서로 주고 받을 정보들은 인스턴스 변수를 이용해야 한다.

 

2) 테스트를 위한 애플리케이션 컨텍스트 관리

: 각각의 테스트 메소드가 실행될 때, 모든 테스트의 독립성을 보장하기 위해 테스트 클래스의 오브젝트는 새로 생성된다.

앞의 예제에서는 테스트마다 ApplicationContext를 생성하였는데, 매번 새로운 테스트 오브젝트가 생성되는 것은 많은 시간과 리소스를 필요로 한다. 이러한 문제 해결을 위해서 스프링은 테스트 컨텍스트 프레임워크를 제공해준다.

또한 여러 개의 테스트 클래스에서도 애플리케이션 컨텍스트를 공유할 수 있다.

 

1. 클래스에 @RunWith@ContextConfiguration(location="/applicationContext.xml") 을 추가

2. ApplicationContext타입의 인스턴스 변수를 선언하고 @Autowired 추가

 

// 테스트 어플리케이션컨텍스트 프레임워크 사용을 위한 어노테이션 추가 

@ContextConfiguration(locations = "/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class BoardDaoTest {

	@Autowired
	private ApplicationContext context;
	private BoardDao dao;

	@Before
	public void init() {
		dao = context.getBean("boardDao", BoardDao.class);
	}

	@Test
	public void insertTest() throws SQLException {
		// 공통부분은 @Before로 빼고, 인스턴스변수 사용
		// ApplicationContext context = new
		// ClassPathXmlApplicationContext("applicationContext.xml");
		// BoardDao dao = context.getBean("boardDao", BoardDao.class);

		dao.deleteAll();
		assertThat(dao.count(), is(0));

		dao.add(new Board("제목", "글"));
		assertThat(dao.count(), is(1));
	}

	// ...
}

 

 

위에서 본 것과 같이, JUnit 테스트에서도 필요한 오브젝트는 DI로 주입받는다.

그렇다면 테스트 환경과 실제 운영 환경에서 주입받고 하는 Bean이 서로 다르다고 생각해보자. (예를 들어 DataSource)

이런 경우에 JUnit에서는 (1)특정 테스트 클래스 or 메소드에서만 새로 오브젝트를 생성하여 DI하는 @DirtiesContext 어노테이션 기능을 제공해준다. 또는, (2)applicationContext.xml을 새로 만들어 교체해주는 방법이나 아예 (3)어플리케이션컨텍스트는 사용하지 않고 테스트 오브젝트를 만드는 단순한 방법이 있다.

 

 

(교재의 학습데이터 테스트 부분은 생략한다.)

 

 

[참고서적] http://www.acornpub.co.kr/book/toby-spring3.1-vol1#spring3

 

토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리

스프링의 핵심 프로그래밍 모델의 원리와 이에 적용된 다양한 디자인 패턴, 프로그래밍 기법의 이해를 돕는 책

www.acornpub.co.kr