2015-01-12 2 views
3

도메인 클래스 및 서비스 등이 포함 된 플러그인 프로젝트가 있습니다. 플러그인 프로젝트를 사용하는 응용 프로그램 프로젝트가 있습니다. 이것은 일반적인 패턴입니다. 응용 프로그램 컨텍스트가 없으므로 통합 테스트 (DB에 충돌)는 플러그인 프로젝트에서 실행되지 않으므로 기본 응용 프로그램 프로젝트에서 통합 테스트를 실행합니다."ApplicationContext를 찾을 수 없으므로 먼저 Grails를 올바르게 설정하십시오"

/*@TestFor(Site)*/ 
class SiteIntegrationSpec extends IntegrationSpec { 
    static transactional=false; 
    def setup() { 
    } 
    def cleanup() { 
    } 
    void "test something"() { 
     Site site 

     when: 
     site = Site.get(1L) 

     then: 
     site.name == "root" 
    } 
} 

이 사이트는 이와 유사한 단지 도메인 객체된다 : TestFor (사이트)에 그것을 시도 유엔 - 주석 :

class Site { 
    String name  
    // some more fields here 
} 

참고

우리는 매우 간단한 통합 테스트를 또한 - 같은 오류.

DB를 보면 사이트 항목이 있습니다.

좋아, 다른 단서를 찾았습니다. SiteIntegrationSpec 테스트가 작동하는 데 사용되었습니다. 두 번째 테스트 인 ParamIntegrationSpec을 추가하기 전에 작동했습니다. 우리는 thusly 히 자신에 이러한 테스트 중 하나를 실행하는 경우 :

test-app --stacktrace --verbose *IntegrationSpec 

SiteIntegrationSpec 시험 :

test-app --stacktrace --verbose ParamIntegrationSpec 

test-app --stacktrace --verbose SiteIntegrationSpec 

작동 작동하지만 우리는 그들 모두를 실행하는 경우 항상 위의 예외와 함께 실패합니다.

어떤 아이디어가 있습니까?

전체 스택 추적 :

java.lang.IllegalStateException: Could not find ApplicationContext, configure Grails correctly first 
at grails.util.Holders.getApplicationContext(Holders.java:97) 
at grails.test.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy:41) 

주 2 :

test-app --stacktrace --verbose -integration 

는 사이트 테스트에서 동일한 오류를 제공합니다.

+0

왜 이런 일이 발생하는지 정확히 알 수 없지만 다른 사양은 다른 사양을 오염시키는 무언가를하고 있습니다. http://naleid.com/blog/2012/05/22/fixing-grails-tests-that-pass-in-isolation-but-fail-when-run-as-a-suite – user1690588

+0

다음을 시도해보십시오. http : //스택 오버플로.com/questions/24957901/grails-integrationspec-illegalstateexception – user1690588

답변

5

user1690588 덕분에 문제가 발견되었습니다. Grails IntegrationSpec IllegalStateException는 나에게 실마리를 줬다 : probem은 실패한 테스트가 아니었지만, 통과 한 테스트에서!

기본적으로 ParamIntegrationSpec 시험했다 :

@TestFor(ParamService) 

이 후속 테스트를 죽이고 있습니다. 나는 TestFor가하는 일을 전혀 모른다. 단지 모든 예제에서 그것을 본다.

수정하려면 작동중인 테스트에서 해당 라인을 제거하십시오.

+2

이것은 왜 copypasta가 효과적인 개발 전략이 아닌지 보여주는 좋은 예입니다 : @ TestFor'는 _unit_ 테스트 주석이고 클래스를 가짜 행동으로 혼합하여 유닛을 얻습니다 테스트 환경, 실제 Spring/Hibernate/(대부분의) 플러그인/etc가없는 곳. 활성화되어있어 통합 테스트 및 실행 응용 프로그램 환경과 다소 유사합니다. 단위 테스트와 통합 테스트 코드를 논리적으로 섞어서는 안되지만 테스트 결과에 부정적인 영향을 미친다는 것을 알 수 있습니다. 그것은 더 나 빠졌을 수 있습니다 - 거짓 긍정을 일으킬 수 있습니다. –

+0

테스트 서비스 용 TestFor는 이러한 문제를 야기하지만 컨트롤러 테스트를 위해 컨트롤러 변수와 인스턴스를 통합 테스트에 주입합니다. 이것이 사용되지 않는다면 컨트롤러 인스턴스를 수동으로 생성해야합니다. 그래서 다소 복잡하고 Grails 의사는 컨트롤러와 서비스를 테스트하고 유닛과 통합을 테스트하는 방법에 대해별로 좋지 도는 것도 없습니다. –

관련 문제