[SPRING] 스프링 테스트에서 @Test 메소드를 사용하기 전에 데이터베이스를 한 번만 채우는 방법은 무엇입니까?
SPRING스프링 테스트에서 @Test 메소드를 사용하기 전에 데이터베이스를 한 번만 채우는 방법은 무엇입니까?
junit4를 사용하여 스프링 서비스 계층을 테스트하는 다음 문제는 다음과 같다. @Test 메서드를 사용하기 전에 데이터베이스를 한 번만 채우는 스크립트를 호출하는 방법 : 나는 이것을 한 번 실행하기 전에 @Tests :
JdbcTestUtils.executeSqlScript(jdbcTemplate(), new FileSystemResource(
"src/main/resources/sql/mysql/javahelp-insert.sql"), false);
내 GenericServiceTest 클래스 (테스트 클래스로 확장)에서 @PostConstruct를 사용하려고했습니다. @PostConstruct는 매번 @Test 메서드가 호출되기 전에 매번 호출됩니다. 흥미로운 점은 GenericServiceTest의 @Autowired 주석이 달린 메소드조차도 @Test 메소드를 호출하기 전에 호출된다는 것입니다.
모든 테스트 클래스 전에 데이터베이스를 채우고 싶지는 않지만 스프링 테스트 시작시 한 번만 데이터베이스를 채우고 싶습니다.
스프링 테스트 프레임 워크와 junit4를 사용하여 @Test 메소드를 실행하기 전에 위의 메소드를 한 번만 실행하는 방법은 무엇입니까?
고맙습니다!
해결법
-
==============================
1.스프링 내장 데이터베이스 지원 사용
스프링 내장 데이터베이스 지원 사용
<jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:myScript.sql"/> <jdbc:script location="classpath:otherScript.sql"/> </jdbc:embedded-database>
또는 스프링스 데이터베이스 지원 초기화
<jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:myScript.sql"/> <jdbc:script location="classpath:otherScript.sql"/> </jdbc:initialize-database>
@See http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-embedded-database-support
-
==============================
2.Alfredos에 대한 답을 바탕으로, 이것은 임베디드 데이터베이스의 기본 스크립트를 호출하지 않고 데이터베이스 정보를 주입하는 방법입니다. 예를 들어, 이것은 적어도 테스트에서 자동으로 DDL을 빌드하고자 할 때 유용 할 수 있습니다.
Alfredos에 대한 답을 바탕으로, 이것은 임베디드 데이터베이스의 기본 스크립트를 호출하지 않고 데이터베이스 정보를 주입하는 방법입니다. 예를 들어, 이것은 적어도 테스트에서 자동으로 DDL을 빌드하고자 할 때 유용 할 수 있습니다.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/applicationContext.xml"}) public class TestClass { @Autowired private ApplicationContext ctx; private JdbcTemplate template; @Autowired public void setDataSource(DataSource dataSource) { template = new JdbcTemplate(dataSource); } private static boolean isInitialized = false; @Before public void runOnce() { if (isInitialized) return; System.out.println("Initializing database"); String script = "classpath:script.sql"; Resource resource = ctx.getResource(script); JdbcTestUtils.executeSqlScript(template, resource, true); isInitialized = true; } }
이렇게하면 runOnce () 메서드가 테스트 실행을 위해 한 번만 호출됩니다. isInitialized를 인스턴스 필드 (비 정적)로 만들면 모든 테스트를 수행하기 전에 메서드가 호출됩니다. 이렇게하면 필요한 경우 모든 테스트를 실행하기 전에 테이블을 삭제하거나 다시 채울 수 있습니다.
이것은 여전히 신속하고 더러운 솔루션이며 데이터베이스를 처리하는 합리적인 방법은 Ralph의 대답에 따른 것입니다.
-
==============================
3.당신이 봄 부팅하는 경우에, 당신은 테스트를 거치기 전에 여러 스크립트를 언급 할 수 있습니다.
당신이 봄 부팅하는 경우에, 당신은 테스트를 거치기 전에 여러 스크립트를 언급 할 수 있습니다.
spring.datasource.data=classpath:accounts.sql, classpath:books.sql, classpath:reviews.sql
from https://stackoverflow.com/questions/17505952/how-to-populate-database-only-once-before-test-methods-in-spring-test by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Java Spring AOP : CustomizableTraceInterceptor를 JavaConfig와 함께 사용 @EnableAspectJAutoProxy, XML이 아닌 <aop : advisor> (0) | 2019.01.29 |
---|---|
[SPRING] RestTemplate을 사용한 Spring 4.0.0 기본 인증 (0) | 2019.01.29 |
[SPRING] TaskScheduler, @Scheduled 및 석영 (0) | 2019.01.29 |
[SPRING] 스프링 부트 시작 시간 최소화 [duplicate] (0) | 2019.01.29 |
[SPRING] Spring에서 트랜잭션을 사용할 때 포스트 커밋 만들기 (0) | 2019.01.29 |