0

以下は私たちが行っていることで、grails 2.0.0 と spock 0.6 で動作しました。

シンプルなドメイン:

package com.grails
class User {
    String name, password
    def methodWithNoArguments(){
        return "Object: methodWithNoArguments"
    }
    static constraints = {
    }
}

ユニット仕様:

package com.grails

import spock.lang.* 
import grails.test.mixin.TestFor 
import grails.test.mixin.Mock 
import grails.test.GrailsMock

@TestFor(UserController)  // testing for 
@Mock([User])             // collaborators class 
UserControllerSpec extends  Specification {
    // DOES NOT work in 2.2.3 spock 0.7,
    // WORKS in grails-2.0.0 spock 0.6
    def 'create a Domain collaborator using Mock'() {
        given: 'user'
        // can't mock this anymore, causes classcast exception.
        User user = Mock(User)

        user.methodWithNoArguments()  >> { "Mock: (3) methodWithNoArguments" }

        when: 'we call the method'
        def val1 = user.methodWithNoArguments()

        then: 'value should be from the mocked method'
        val1 == "Mock: (3) methodWithNoArguments"
    } }

上記により、grails 2.2.3 および spock 0.7 で次の例外が発生します。注 ( grails-2.0.0 および spock 0.6 で動作します)

| | java.lang.ClassCastException: com.grails.User は、org.spockframework の org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:93) で net.sf.cglib.proxy.Factory にキャストできません。 mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49) org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51) org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java: 44) org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:47) で org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:282) で org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java) :99) com.grails.UserControllerSpec.

互換性のないライブラリがいくつかあるのではないかと考えています。ここに BuildConfig.groovy があります

dependencies {
    test "org.spockframework:spock-grails-support:0.7-groovy-2.0"
}

plugins {
    runtime ":hibernate:$grailsVersion"
    runtime ":jquery:1.8.3"
    runtime ":resources:1.2"

    build ":tomcat:$grailsVersion"

    runtime ":database-migration:1.3.2"

    compile ':cache:1.0.1'
    test(":spock:0.7") {
        exclude "spock-grails-support"
    }
}

サンプル テスト アプリは git@github.com:nbostech/grails-spock-2.2.3.git にあります。

git チェックアウト grails-2.0.0; <2.0.0>/bin/grails test-app --unit UserControllerSpec; // すべてのテストに合格

git チェックアウト マスター; <2.2.3>/bin/grails test-app --unit UserControllerSpec; // テストの 1 つが失敗します。

4

1 に答える 1

2

Grails と Spock のモックは、このように混在させることを意図していません。Grails@Mockまたは Spock にしMock()ます。

于 2013-06-29T17:24:21.183 に答える