복붙노트

[SPRING] Spring과 Maven을 이용한 테스트 : applicationContext

SPRING

Spring과 Maven을 이용한 테스트 : applicationContext

그 질문은 세상으로 보입니다. 그러나 나는 여전히 해결책을 찾을 수 없습니다.

간단한 테스트를 실행하려고합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext.xml", "/PersonsPopulateTest-context.xml"})
@Transactional
public class PersonsPopulateTest {

파일 위치 :

src
   main
      resources
           applicationContext.xml

src        
   test
      resources
          PersonsPopulateTest-context.xml 

그래서이 파일을 빌드 한 후에는 target / classes 및 target / test-classes에 있습니다.

하지만 mvn test 명령은 여전히 ​​다음과 같이 말합니다 : ApplicationContext를로드하지 못했습니다.

공식 문서가 말하는 것 :

@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
    // class body...
}

나는 어디로 잘못 갔는가?

감사, 블라디미르

최신 정보. 확실한보고 :

java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
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.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Caused by: java.lang.IllegalArgumentException: Can not load an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:117)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
... 30 more

해결법

  1. ==============================

    1.메이븐 (Maven)은 메인 / 리소스의 XML 파일을 단순히 포함하지 않았다고 생각한다.

    메이븐 (Maven)은 메인 / 리소스의 XML 파일을 단순히 포함하지 않았다고 생각한다.

    pom.xml에 포함 할 내용을 명시 적으로 지정하려고 할 수 있습니다.

    다음 구성이 제대로 작동하는지 알려주세요.

        <!-- Add this directly after the <build>-opening tag -->
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/test/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                </includes>
                <excludes>
                    <exclude>**/*local.properties</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    

    이것은 내가 당신의 경우에 사용하는 것입니다. 포함될 특성 파일이 없으면이를 편집 할 수 있습니다.

  2. ==============================

    2.내 테스트 컨텍스트 파일은 src \ test \ resources \ spring 폴더 아래에 있습니다. 나는 컨텍스트를로드 할 수 있었다.

    내 테스트 컨텍스트 파일은 src \ test \ resources \ spring 폴더 아래에 있습니다. 나는 컨텍스트를로드 할 수 있었다.

    @ContextConfiguration(locations={"classpath:**/test-context.xml"})
    

    그러나 src \ main \ resources \ spring 폴더 아래에있는 application-context.xml에 대한 test-context.xml의 참조가 실패했습니다.

    테스트 클래스에서 ClassPathXmlApplicationContext를 생성하여 애플리케이션 컨텍스트를로드 할 수 있었다.

    ClassPathXmlApplicationContext appContext=new ClassPathXmlApplicationContext(new String[]{"classpath:spring/application-context.xml","classpath:spring/model-context.xml"});
    

    이 문제가 도움이되는지 또는 다른 문제를 유발할 수 있는지 알려 주시기 바랍니다.

  3. ==============================

    3.필자는 src / test / resources 아래에 PersonsPopulateTest-context.xml을 테스트하기위한 애플리케이션 컨텍스트 파일을 두는 것이 가장 좋은 방법이라고 생각한다. 이 파일은 target / test-classes에 복사 될 것이고 당신은 당신의 테스트 클래스에서 다음과 같이 그것을 참조 할 수 있습니다 :

    필자는 src / test / resources 아래에 PersonsPopulateTest-context.xml을 테스트하기위한 애플리케이션 컨텍스트 파일을 두는 것이 가장 좋은 방법이라고 생각한다. 이 파일은 target / test-classes에 복사 될 것이고 당신은 당신의 테스트 클래스에서 다음과 같이 그것을 참조 할 수 있습니다 :

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:**/PersonsPopulateTest-context.xml"})
    @Transactional
    public class PersonsPopulateTest {
    
    }
    

    src / main / resources 아래의 applicationContext.xml을 계속 참조하려면 다음과 같이 include해야합니다.

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"file:src/main/resources/applicationContext.xml"})
    @Transactional
    public class PersonsPopulateTest {
    
    }
    

    그것은 나를 위해 일했습니다.

  4. ==============================

    4.

    <!-- Add this directly after the <build>-opening tag in the your pom-->
                <testResources>
                    <testResource>
                        <directory>src/test/resources</directory>
                        <filtering>true</filtering>
                        <includes>
                            <include>**/*.xml</include>
                            <include>**/*.properties</include>
                        </includes>
                    </testResource>
                </testResources>
    
  5. ==============================

    5.응용 프로그램 컨텍스트가 classpath에 포함되고 *를 넣어야합니다.

    응용 프로그램 컨텍스트가 classpath에 포함되고 *를 넣어야합니다.

    @ContextConfiguration(locations = { "classpath:*/application-context.xml" })
    
  6. ==============================

    6.웬일인지, 같은 문제가 있었고 JDK8 대신 JDK6을 사용하여 메이븐 테스트를 실행했습니다 (제 경우에는 레거시 응용 프로그램입니다)

    웬일인지, 같은 문제가 있었고 JDK8 대신 JDK6을 사용하여 메이븐 테스트를 실행했습니다 (제 경우에는 레거시 응용 프로그램입니다)

    누군가를 돕는다면.

  7. ==============================

    7.나는 똑같은 문제에 직면했다. 나를 위해 테스트는 일식을 통해 성공적으로 실행되었습니다. 그러나 mvn 테스트를 실행하면 오류가 발생했습니다. ApplicationContext를로드하지 못했습니다.

    나는 똑같은 문제에 직면했다. 나를 위해 테스트는 일식을 통해 성공적으로 실행되었습니다. 그러나 mvn 테스트를 실행하면 오류가 발생했습니다. ApplicationContext를로드하지 못했습니다.

    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.10</version>
                <configuration>
                    <additionalClasspathElements>
                        <additionalClasspathElement>${project.basedir}/src/test/resources</additionalClasspathElement>
                    </additionalClasspathElements>      
                </configuration>
    

    SureFire에 classpath 추가하기

    희망이 도움이됩니다.

  8. ==============================

    8.나는 같은 문제를 겪었고, 모든 파일은 target / classes와 target / test-classes에 성공적으로 복사되었지만, 여전히 봄은 그것을 찾을 수 없었다.

    나는 같은 문제를 겪었고, 모든 파일은 target / classes와 target / test-classes에 성공적으로 복사되었지만, 여전히 봄은 그것을 찾을 수 없었다.

    paven에서 maven-surefire-plugin 및 maven-resources-plugin의 버전을 명시 적으로 지정하면 문제가 사라졌습니다.

  9. ==============================

    9.업데이트 : 실제로 제 경우에는 문제가 컴파일시 저장 옵션에 있습니다. Netbeans를 사용하고 옵션이 테스트 실행 전용으로 설정되었습니다. 이 값은 변경된 파일을 컴파일하고 자원을 새 파일로 바꿉니다. 그러나 테스트 리소스에 추가로 응용 프로그램 리소스를 사용하기 때문에 테스트 실행시 대상 폴더에 잘못 생성 된 리소스 만 생성됩니다.

    업데이트 : 실제로 제 경우에는 문제가 컴파일시 저장 옵션에 있습니다. Netbeans를 사용하고 옵션이 테스트 실행 전용으로 설정되었습니다. 이 값은 변경된 파일을 컴파일하고 자원을 새 파일로 바꿉니다. 그러나 테스트 리소스에 추가로 응용 프로그램 리소스를 사용하기 때문에 테스트 실행시 대상 폴더에 잘못 생성 된 리소스 만 생성됩니다.

    저장시 컴파일 변경 = 테스트 실행 전용

    Save = Save에서 컴파일하면 문제가 해결됩니다.

    아래의 텍스트도 정확하지만 때로는 작동하지 않습니다. 그것은 Netbeans IDE를 다시 시작할 때까지만 작동했습니다. 그러나 문제의 원인에 대한 자세한 내용은 정확하므로 테스트를 끝내는 것이 좋습니다.

    늙은: 제 상황에서는 src / main / resources에 appContext-test.xml이 있습니다. 코드를 변경하고 하나의 단위 테스트를 실행하면 (모든 코드가 아닌) 다시 컴파일되고 올바르게 실행됩니다. 하지만 같은 단위 테스트를 다시 시작하면 java.lang.IllegalStateException으로 실패합니다 : ApplicationContext를로드하지 못했습니다.

    pom.xml을에서 변경했습니다.

    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/java/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>
    

    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </testResource>
            <testResource>
                <directory>${project.basedir}/src/test/java/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>
    

    이제는 모두 잘 작동합니다.

    이 오류는 appContext-test.xml이 src / main / resources / my.properties 파일을 사용하여

    database.url = ${database.url}
    database.username = ${database.username}
    database.password = ${database.password}
    

    빌드하는 동안 채워진 그러나 testResource에서 src / main / resources를 건너 뛴 경우 my.properties가 target / classes / my.properties에 추가됩니다 (예 : 대체하지 않고. 물론이 파일은 문맥을 파괴합니다.

    추신 : 당신은 $ {project.basedir} /을 제거 할 수 있습니다 - 그것은 나의 커스텀입니다.

  10. from https://stackoverflow.com/questions/10104372/testing-with-spring-and-maven-applicationcontext by cc-by-sa and MIT license