12

テストのドメイン オブジェクトに注入された依存関係を取得する必要があります。

このテストは test/integration ディレクトリに置かれ、spock.lang.Specification.

どうすればこれを達成できますか?

注: この投稿How to inject spring beans into spock testを見たことがありますが、grails とは関係ありません。

編集:

注入したい依存関係はspringSecurityServiceSecUserというサブクラスにありPlayerます。失敗しているメソッドは でencodePassword()、 で呼び出されますbeforeInsert()

一部のテストでこのencodePassword()メソッドをモックできますが、コントローラー メソッドをテストしたい場合、作成中の をsave()モックするPlayerことはできません。これはすべてコントローラー メソッド内で行われるためです。

extend に変更した後IntegrationSpec、これが私のテスト コードです。

package intertigre.test.domain
import intertigre.domain.Fecha;
import intertigre.test.util.DomainFactoryTestService
import grails.plugin.spock.IntegrationSpec
import grails.test.mixin.TestFor

    @TestFor(Fecha)
    class FechaSpec extends IntegrationSpec{

    DomainFactoryTestService domainFactoryTestService = new DomainFactoryTestService()

    def 'test'(){
        given:
            def fecha = new Fecha()
        when:
            fecha.save()
        then:
            Fecha.get(1) == fecha
    }

}

実行中にこの例外が発生しますgrails test-app :spock

java.lang.NullPointerException: Cannot get property 'mainContext' on null object
    at grails.plugin.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy)

そして、これは私が単独でテストを実行したときのものです:

| Failure:  intertigre.test.domain.FechaSpec
|  java.lang.NullPointerException: Cannot get property 'autowireCapableBeanFactory' on null object
    at grails.plugin.spock.IntegrationSpec.setupSpec(IntegrationSpec.groovy:47)
| Failure:  intertigre.test.domain.FechaSpec
|  java.lang.NullPointerException: Cannot invoke method isActive() on null object
    at grails.test.mixin.support.GrailsUnitTestMixin.shutdownApplicationContext(GrailsUnitTestMixin.groovy:232)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176)
    at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145)
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176)
4

2 に答える 2

12

コントローラーで行う場合と同様に、springSecurityService をテストに宣言してみてください。Grails はあなたのためにすべての仕事をすることになっています :)

統合テストの場合、次のようにします。

package intertigre.test.domain
import intertigre.domain.Fecha;
import intertigre.test.util.DomainFactoryTestService
import grails.plugin.spock.IntegrationSpec

class DomainFactoryTestServiceSpec extends IntegrationSpec{

def domainFactoryTestService // you dont need to create a new instance, it's injected by spring

def 'test'(){
     given:
         // ...
     when:
         // ...
     then:
         // ....
 }

特定のドメイン オブジェクトを (Fecha クラスとして) テストする必要がある場合は、次のような単体テストが必要になる可能性があります。

package intertigre.test.domain
import intertigre.domain.Fecha
import intertigre.test.util.DomainFactoryTestService
import grails.test.mixin.TestFor
import grails.test.mixin.Mock
import spock.lang.Specification

@TestFor(Fecha)
@Mock([OtherObject1, OtherObject2])
class FechaSpec extends Specification {

def domainFactoryTestService // same thing here, if you need the service

def 'test'() {
     given:
         def fecha = new Fecha()
     and:
         def oo1 = new OtherObject1()
     when:
         // ...
     then:
         // ....
 }

単体テストを使用してサービスをテストすることもできます。これは、何をテストするかによって異なります (クラス (サービス) または「状況」 (サービスの使用方法))。

Ps。もちろん、このコードはテストされておらず、タイプミスが含まれている可能性があります。:)しかし、テスト方法についての私の要点を理解していただければ幸いです。

于 2012-08-14T13:12:46.400 に答える