문제

여러 스프링 Bean 정의 XML 파일에 큰 응용 프로그램이 퍼져 있습니다. 테스트 스위트에서는 XML 파일을 수동으로로드하여 FileSystemXmlApplicationContext를 사용하여 실행하려는 테스트를 수행합니다. 이를 통해 테스트 설정 시간이 줄어들고 제작에 사용되는 동일한 정확한 구성 파일을 사용할 수 있습니다.

이제 저는 구성 위치를 취하고 컨텍스트를로드하는 Spring의 트랜잭션 테스트 기반 클래스를 사용하려고합니다. 응용 프로그램 컨텍스트가 생성 될 때 어떤 이유로 스프링은 구성 파일을 찾을 수 없습니다. FileSystemXmlApplicationContext를 사용하여 구성을 직접로드 할 때와 동일한 작업 디렉토리에서 테스트를 실행하기 때문에 혼란 스럽습니다. 모든 구성 위치를 "파일 :"테스트에 지정한 경로를 찾아야하지만 구성 (예 : 속성 파일)에 정의 된 Bean에서 가져 오거나 참조하는 파일을 찾을 수 없습니다. 거래는 무엇입니까? 스프링 컨텍스트 테스트 클래스를 확장하는 테스트를받을 수 있도록 컨텍스트를 직접 만드는 것과 동일하게 작동 할 수 있습니까?

예를 들어, 이와 같은 컨텍스트를 만드는 것이 좋습니다.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

AbstractTransactionAldAtAsourcespringContextTests를 확장하면 다음은 Services-context.xml을 찾을 수 없습니다.

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

이는 Services-Context를 발견하지만 PropertyPlaceHolderConfigurer는 Properties 파일을 찾지 못합니다.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
도움이 되었습니까?

해결책 2

getConfigLocations를 재정의하는 것 외에도 LoadContext를 무히 지정하고 신뢰할 수있는 filesystemxmlapplicationContext를 사용했습니다.

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

다른 팁

우리는 모든 스프링 구성 및 속성 파일을 클래스 경로에 넣습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

여기서 경로는 모든 클래스 경로의 경로입니다.

그렇게하고 싶지 않다면 Services-context.xml에서 속성 파일을 참조하는 방법을 확인 했습니까? 파일을 추가하면 컨텍스트 구성에 파일을 추가하면 속성 파일 참조에도 추가해야합니다. 별도의 테스트 스프링 구성 파일을 사용하여 속성 자리 표시 자의 정의를 변경하고 컨텍스트 파일 목록의 끝에 배치 할 수 있습니다. 그러면 그 정의는 이전 파일에 정의 된 것들을 무시합니다.

구성 위치는 상대 URI이며 기본 테스트 클래스에 의해 해석되며 URI는 테스트 클래스 자체의 위치에 비해 해결됩니다. 완전히 자격을 갖춘 URI를 사용하거나 테스트 클래스가있는 곳을 고려하여 상대 URI를 사용하십시오.

ClassPath XML 공장을 사용할 수는 없습니다 classPathXmlApplicationContext?

또 다른 가능한 솔루션은 다음을 복제하는 것입니다 services-config.xml 그리고 이름을 바꿉니다 services-config-test.xml 그런 다음 클래스 경로 아래에 두십시오. 속성 파일에 대해서도 마찬가지입니다.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top