programing

Spring Junit 응용 프로그램 컨텍스트를 테스트 클래스에서 더럽힌 후 재설정하는 방법은 무엇입니까?

oldcodes 2023. 8. 7. 23:03
반응형

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

반응형