프로젝트가 진행될 수록 특정 테스트 만을 위한 설정 파일 수가 엄청 증가합니다. 그런데 설정파일은 변경될 수 밖에 없고, 카피해 두었던 테스트를 위한 설정파일들은 그 표준과 달라서 기존 테스트들을 깨지게 합니다.
설정 오버라이딩 이라는 개념을 도입하여 깔끔히 처리하는 방법을 소개합니다.
16. Waple 프로젝트
ApiStore의 엔진 서버
Maven을 사용
표준 폴더 구조
◦ src/main/java
◦ src/test/java
◦ src/main/resources
◦ src/test/resources
17. 4가지 설정 파일
log4j_config.xml
hibernate_config.xml
spring-context.xml
waple.properties
표준 설정 파일은 src/main/resources
에
18. 하지만 테스트 케이스별 설정파
일은
개별리소스 폴더에
src/test/java
◦ com/some/MyTest.java
◦ com/some/MyTest_resource
spring-context.xml
waple.properties
src/main/java가 아닌 src/test/java의
테스트 케이스 클래스 바로 옆
20. 앞 예의 spring-context.xml
테스트를 위한 mock 클래스 설정만.
기타 모든 설정은 표준 설정과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="callValidationManager"
class="com….InvokerResourceTest_resource.MockCallValidationManager"/>
</beans>
21. 누가 오버라이딩?
테스트 케이스 Runner를 좀 수정.
현재 테스트 케이스의 위치를 알아내고
◦ com.some.MyTest
테스트 케이스 별 리소스 폴더 유무를 보
고
com.some.MyTest_resource
존재하면 표준 설정에 테스트 케이스별
설정을 오버라이딩 하여 적용
22. 오버라이딩 방법 - Spring
자체 지원한다.
설정 파일을 어레이로 넘기면 됨.
String[] configFiles = …
new ClassPathXmlApplicationContext(configFiles);
23. 오버라이딩 방법 - Hibernate
자체 지원한다.
설정 파일을 반복하여 설정하면 됨.
Configuration configuration = …
for(String configFileName : configFileNameList) {
configuration.configure(configFileName);
}
ServiceRegistry serviceRegistry = …
sessionFactory =
configuration.buildSessionFactory(serviceRegistry);
24. 오버라이딩 방법 - Log4j
지원 않한다.
설정 파일들을 XML연산하여 하나의
XML로 만들어 처리.
Document mergedConfigDocument =
Log4jConfigMerger.merge(configFileNameList);
// get root from mergedConfigDocument
Element rootElement = ...
DOMConfigurator.configure(rootElement);
25. 오버라이딩 방법 - properties
이를 위한 Spring의 것을 활용
<bean id="properties"
class="com.kthcorp.waple.fortest.OverridablePropertiesFactoryBean">
<property name="locations">
<value>classpath:/waple.properties</value>
</property>
</bean>
public class OverridablePropertiesFactoryBean extends PropertiesFactoryBean
{
@Override public void setLocations(Resource[] locations) {
String testCaseClassName = getTestCaseClassName();
Resource testResource = findTestResource(testCaseClassName, ...);
Recource[] newLocations = ... // locations와 testResource를 합한다.