스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트이다.
웹을 통한 DAO 테스트의 문제점
DAO뿐만 아니라 서비스 클래스, 컨트롤러, JSP 뷰 등 모든 레이어의 기능을 만들고 나서야 테스트가 가능하다는 점이 가장 큰 문제였다.
사실 테스트하고 싶었떤 건 UserDao 였는데 다른 계층의 코드와 컴포넌트, 심지어 서버의 설정 상태까지 모두 테스트에 영향을 줄 수 있기 때문에 이러한 방식으로 테스트하는 것은 번거롭고, 오류가 있을 때 빠르고 정확하게 대응하기가 힘들다는 문제가 있다.
테스트하고자 하는 대상이 명확하다면 그 대상에만 집중해서 테스트하는 것이 바람직하다.(단위 테스트)
=> 안하게되면 이유를 찾기위해서 디버거를 돌려가며 스텝별로 확인해야하는 수고를 하게될지도 모른다.
테스트를 위한 애플리케이션 컨텍스트 관리
Junit에서 @Before는 @Test전에 실행이된다. 대체적으로 @Test하기 전에 필요한 환경셋팅을 할 때 사용하는데, 아래와 같이 설정을 했을 때 문제가 될 수도 있다.
1 2 3 4 5 | @Before public void setUp(){ ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml"); this.dao = context.getBean("userDao", UserDao.class); } | cs |
이유는 매번 @Test 메소드 개수만큼 @Before가 실행되기 때문에 컨텍스트도 3번 만들어지기 때문이다.
bean이 많아지고 복잡해지면 애플리케이션 컨텍스트 생성에 적지 않은 시간이 걸릴 수 있다.
스프링은 Junit을 이용하는 테스트 컨텍스트 프레임워크를 제공한다.
maven사용시 pom.xml에 아래와 같이 추가(spring.framework.version 설정)
1 2 3 4 5 | <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.framework.version}</version> </dependency> | cs |
테스트 컨텍스트의 지원을 받으면 간단한 어노테이션 설정만으로 테스트에 필요로 하는 컨텍스트를 만들어서 컨텍스트를 공유하게 할 수 있다.
@Before를 제거하고, 이 ApplicationContext타입의 인스턴스 변수를 선언하고 @Autowired를 붙인다.
그리고 클래스 레벨에 @RunWith와 @ContextConfiguration을 추가한다.
1 2 3 4 5 6 7 8 | // 스프링의 테스트 컨텍스트 프레임워크의 JUnit 확장기능 지정 @RunWith(SpringJunit4ClassRunner.class) // 테스트 컨텍스트가 자동으로 만들어줄 애플리케이션 컨텍스트의위치 지정 @ContextConfiguration(location="classpath:/applicationContext.xml"); public class UserDaoTest{ @Autowired // 스프링 테스트 컨텍스트에 의해 자동으로 값이 주입 private ApplicationContext context; } | cs |
@RuntWith는 Junit 프레임워크의 테스트 실행 방법을 확장할 때 사용하는 어노테이션이다.
SpringJunit4ClassRunner라는 Junit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면 Junit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리하는 작업을 진행해준다.
@ContextConfiguration은 자동으로 만들어줄 애플리케이션 컨텍스트의 설정파일위치를 지정해서 사용한다.
@Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 변수 타입과 일치하는 컨텍스트 내의 빈을 찾는다. 타입이 일치하는 빈이 있으면 인스턴스 변수에 주입해준다.
만약에 다중의 context를 추가해야할 경우
1 2 3 4 5 | @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml", "file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/security-context.xml" }) | cs |
형식으로 사용
예시) 실제 구현했던 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/context/pki-context.xml") public class SignatureProviderTest { private static final Logger LOG = LoggerFactory.getLogger(SignatureProviderTest.class); @Inject SignatureProvider signatureService; @Inject VerificationProvider verificationService; @Value("#{edoc['cert.verifiable']}") private boolean certVerifiable; @Test public void verifySignValue(){ String filePath = "c://build.txt"; String hashValue = SignatureUtil.getHashValueFromFile(filePath); String signValue = signatureService.getSignValue(hashValue); LOG.info("signValue : {}", signValue); LOG.info("verifiable : {}", certVerifiable); assertEquals(verificationService.getSource(signValue), hashValue); verificationService.verifySignValue(signValue, certVerifiable); verificationService.getCertInfo(signValue); } .... } | cs |
(내용출처 : 토비의 스프링)
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 모델 바인딩과 검증_1 (0) | 2019.12.23 |
---|---|
[Spring] @ModelAttribute, @RequestAttribute (5) | 2019.07.17 |
[Spring] 팩토리빈과 팩토리메소드 (0) | 2018.09.09 |
[Spring] 빈(bean)생명주기 메소드 (0) | 2018.09.09 |
[Spring] 컨테이너가 자동등록하는 빈 (0) | 2018.09.07 |