2016-12-15 1 views
1

Grails 3에서 어떤 클래스에 대한 단위 테스트를 작성할 때 @TestFor 주석을 사용하여 테스트하려는 클래스를 지정할 수 있습니다. 내 단위 테스트에서는 서비스를 테스트 할 때 테스트중인 클래스가 컨트롤러이고 필드가 "서비스"인 경우 필드 "컨트롤러"가 있으며이 필드를 "테스트중인 시스템"으로 사용할 수 있습니다.@TestFor는 도메인의 단위 테스트에서 무엇을합니까?

@TestFor은 도메인 클래스에 대한 테스트에서 어떻게 사용되고 있는지 궁금합니다. 나는이 사건을 다루는 문서를 찾을 수 없었다. 이 전 도메인 "MYDOMAIN"과 같이 시작하는 테스트 "MyDomainSpec"가 있다고 가정 해 봅시다 :

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    def setup() { 
     def doesntMatter = domain // just to check access to "domain" 

마지막 줄이 이미 나에게

org.codehaus.groovy.runtime.typehandling을 제공합니다. GroovyCastException : 클래스에 클래스의 java.lang.Class의 '와'클래스 MYDOMAIN를 '개체를 캐스팅 할 수 없습니다 아마 Grails는이 클래스의 인스턴스로 MYDOMAIN 클래스를 나타내는 개체를 사용하려고 것을 의미한다'MYDOMAIN '

. 왜 이런 일이 일어나고 코드에 어떤 문제가 있는지 궁금합니다. 내 말은, domain 속성이 존재하며, 이유가 무엇입니까, 그렇지 않습니까? 단순히 액세스 할 때 예외를 throw하는 속성을 사용하려면 어떻게해야합니까?

분명히 예외가 도메인 클래스가의 필드 String name가있는 경우에만 발생합니다
업데이트
. 나는이 분야에 대해 무엇이 특별해야하는지 전혀 모른다. 단순히 버그일까요?

+0

이것은 유용한 기사처럼 보입니다. 그들은 도메인 클래스에서'@ TestFor'를 사용합니다. http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated/ – zero01alpha

+1

@ zero01alpha 이것은 재미있는 독서물입니다. 감사합니다. 그러나 TestFor와 관련하여 그들은 "mockForConstraintsTests"메소드를 사용할 수 있다고 언급합니다. – Matthias

답변

2

@TestFor annotation은 Grails 도메인 클래스에 대해 여러 가지 작업을 수행하지만, 가장 중요한 것은 도메인의 동작 및 GORM 기능을 조롱하고 도메인 클래스의 인스턴스를 반환하는 getter를 제공한다는 것입니다.

도메인 클래스는 프로토 타입 된 스프링 빈으로 등록되므로 getter는 응용 프로그램 컨텍스트에 새 인스턴스를 요청한 다음 해당 인스턴스를 getter에 대한 후속 호출에서 반환되는 개인 $domain 필드로 설정합니다. def doesntMatter = domain은 생성 된 getter를 사용하고 있으며 def doesntMatter = getDomain()과 같으며 getDomain()MyDomain의 새 인스턴스를 반환합니다.

귀하의 가정이 정확하다고 생각됩니다. getter를 호출하면 예외가 발생해서는 안됩니다. 미세 다음 작품 :

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    void "a new domain can be saved"() { 
     given: "a new instance of MyDomain" 
     def d = domain // or getDomain() 

     expect: 
     d.id == null 

     when: 
     d.save() 

     then: 
     d.id != null 
    } 
} 

@Entity 
class MyDomain { 

} 

편집 : 이는 Grails의에서이 문제와 관련되었으며 다음 릴리스에서 해결해야 https://github.com/grails/grails-core/issues/10363를 참조하십시오.

+0

고마워요! 귀하의 코드가 나를 위해 작동합니다. "getter가 요청할 때마다 새로운 인스턴스에 대한 응용 프로그램 컨텍스트를 묻습니다." 내 디버거는 그렇지 않다는 것을 알려줍니다. 도메인이나 getDomain을 연속적으로 사용하는 경우 동일한 인스턴스를 얻습니다. CastException에 관해서 : 분명히 MyDomain에 "String name"필드가있을 때 발생합니다. 이상한 ... – Matthias

+0

미안하지만, 내 실수 야.getter는 private'$ domain' 필드가 null이 아닌 경우에만 애플리케이션 컨텍스트에서 새 인스턴스를 요청합니다. 따라서 명시 적으로'$ domain = null'을 설정하지 않으면 같은 인스턴스를 얻을 수 있습니다. – dpcasady

+0

나는 'String name'을 가진'GroovyCastException'도 보았습니다. 나는 이유를 알아 내려고 노력할 것이다. – dpcasady

관련 문제