Spring Junit 응용 프로그램 컨텍스트를 테스트 클래스에서 더럽힌 후 재설정하는 방법은 무엇입니까?
Spring 3.1.1을 사용하고 있습니다.릴리스, Junit 4.8.1 및 HSQL 2.7.7 인메모리 데이터베이스.다음과 같이 주석이 달린 테스트 클래스가 있습니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-trainingSessionServiceContext.xml" })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class TrainingSessionServiceTest
{
문제는 "mvn clean test"를 실행했을 때 인메모리 데이터베이스가 파괴되어 다시 생성되지 않아 위 클래스 이후에 실행되는 모든 테스트 클래스가 실패한 것 같습니다.다음과 같은 오류가 발생합니다.
org.hibernate.exception.SQLGrammarException: user lacks privilege or object not found: CB_ORGANIZATION" type="javax.persistence.PersistenceException">javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: user lacks privilege or object not found: CB_ORGANIZATION
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:817)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:771)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at $Proxy46.find(Unknown Source)
at org.mainco.subco.organization.repo.OrganizationDaoImpl.findById(OrganizationDaoImpl.java:77)
at org.mainco.subco.pd.repo.LinkDaoTest.createDummyLink(LinkDaoTest.java:686)
at org.mainco.subco.pd.repo.LinkDaoTest.testSaveLink(LinkDaoTest.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
다음은 예외를 제공하는 테스트 클래스를 설정하는 방법입니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class LinkDaoTest extends AbstractTransactionalJUnit4SpringContextTests
{
각 테스트 클래스가 실행되기 전에 응용 프로그램 컨텍스트를 원래 상태로 복원할 수 있는 방법이 있습니까?"TrainingSessionServiceTest" 클래스를 AbstractTransactional로 확장하지 않습니다.Junit4SpringContextTests.다음은 애플리케이션 컨텍스트의 관련 부분입니다.
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:pd" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="persistenceXmlLocation" value="classpath:META-INF/test-persistence.xml"/>
<property name="persistenceUnitName" value="testingDatabase"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven />
<jdbc:embedded-database id="embedded" type="HSQL"/>
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:initialize-database>
@DirtiesContext를 사용하여 강제로 재설정합니다.예를 들어 다음과 같습니다.
@ContextConfiguration(classes={BlahTestConfig.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class SomeTest {
@Autowired XXXX xx;
@Autowired YYYY yy;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(YYYY.newYY()).thenReturn(zz);
}
@Test
public void testSomeTest() {
XX.changeSomething("StringTest");
XX.doSomething();
check_for_effects();
}
@Test
public void testSomeOtherTest() {
XX.changeSomething("SomeotherString");
XX.doSomething();
check_for_effects();
}
스프링 문서에서
더티콘텍스트
테스트 실행 중에 다음과 같이 기본 Spring Application Context가 더러움(수정)되었으며 테스트 통과 여부에 관계없이 닫아야 함을 나타냅니다.
현재 테스트 클래스 이후 클래스 모드가 기본 클래스 모드인 AFTER_CLASS로 설정된 클래스에 선언된 경우.
클래스 모드가 AFTER_EACH_TEST_METHOD로 설정된 클래스에서 현재 테스트 클래스의 각 테스트 방법을 선언한 경우.
현재 테스트 후, 메서드에 선언된 경우.
예를 들어 빈 정의를 교체하여 테스트에서 컨텍스트를 수정한 경우 이 주석을 사용합니다.이후 테스트에는 새 컨텍스트가 제공됩니다.[주] Junit 3.8에서의 @DirtiesContext 제한 사항
> JUNit 3.8 환경에서 @DirtiesContext는 메서드에서만 지원되므로 클래스 수준에서는 지원되지 않습니다.
@DirtiesContext를 클래스 수준 및 메서드 수준 주석으로 동일한 클래스 내에서 사용할 수 있습니다.이러한 시나리오에서 ApplicationContext는 이러한 주석이 달린 메서드 및 전체 클래스 후에 더티로 표시됩니다.ClassMode가 AFT_EACH_TEST_METHOD로 설정된 경우 클래스의 각 테스트 방법 후 컨텍스트가 더티로 표시됩니다.
@DirtiesContext
public class ContextDirtyingTests {
// some tests that result in the Spring container being dirtied
}
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class ContextDirtyingTests {
// some tests that result in the Spring container being dirtied
}
@DirtiesContext
@Test
public void testProcessWhichDirtiesAppCtx() {
// some logic that results in the Spring container being dirtied
}
응용프로그램 컨텍스트가 더티로 표시되면 테스트 프레임워크의 캐시에서 제거되고 닫힙니다. 따라서 동일한 리소스 위치 집합을 가진 컨텍스트가 필요한 후속 테스트를 위해 기본 Spring 컨테이너가 다시 작성됩니다.
언급URL : https://stackoverflow.com/questions/14718088/how-do-you-reset-spring-junit-application-context-after-a-test-class-dirties-it
'programing' 카테고리의 다른 글
키 저장소 정보를 build.gradle에 넣지 않고 APK 서명 (0) | 2023.08.07 |
---|---|
테이블 생성/삭제 후 복원 지점 생성에도 불구하고 "테이블 정의가 변경됨" (0) | 2023.08.07 |
"모듈은 호환되지 않는 버전의 Kotlin으로 컴파일되었습니다.메타데이터의 이진 버전은 1.5.1이며 예상 버전은 1.1.16입니다. (0) | 2023.08.07 |
이중 포인터를 사용하여 2차원 배열을 표현할 수 없는 이유는 무엇입니까? (0) | 2023.08.07 |
복원 지점에서 Win10을 복구하면 데이터는 삭제되지만 데이터베이스 및 테이블은 Maria에 남아 있습니다.DB (0) | 2023.08.07 |