2

サービスユニットテスト内でGrailsFixturesプラグインを使用しようとしています。私はgrails2.2を使用しています。

BuildConfig.groovyに次のコードがあります

plugins {
    compile ":fixtures:1.2"
    compile ":build-test-data:2.0.3"
    ...
    ..
    .
}

最初に試しました

@TestFor(HotelService)
@Mock([Place])
class HotelServiceTests {
    def fixtureLoader 

    void testFixturesInUnitTests() {
        def fixture = fixtureLoader.build {
            hotel(Place, name: "Hotel Hilton")
        }
    }
}

上記のテストは失敗しました:

|  java.lang.NullPointerException: Cannot invoke method build() on null object

Google検索で、Grailsユーザーメーリングリストで、fixtureLoaderが単体テスト内で明示的に作成する必要があることがわかりました。

  import grails.plugin.fixtures.*

  @TestFor(HotelService)
    @Mock([Place])
    class HotelServiceTests {
        def fixtureLoader 
        def grailsApplication

        @Before 
        void setUp() {
            fixtureLoader = new FixtureLoader(grailsApplication)
        }

        void testFixturesInUnitTests() {
            def fixture = fixtureLoader.build {
                hotel(Place, name: "Hotel Hilton")
            }
        }
    }

テストは次のエラーで失敗しました:

 java.lang.NullPointerException: Cannot invoke method hasGrailsPlugin() on null object
    at grails.plugin.fixtures.builder.FixtureBuilder.lookForBuildTestDataPlugin(FixtureBuilder.groovy:53)
    at grails.plugin.fixtures.builder.FixtureBuilder.<init>(FixtureBuilder.groovy:49)
    at grails.plugin.fixtures.Fixture.createBuilder(Fixture.groovy:75)
    at grails.plugin.fixtures.Fixture.build(Fixture.groovy:44)
    at grails.plugin.fixtures.FixtureLoader.build(FixtureLoader.groovy:46)

別のGoogleSearchと私は、前のエラーを回避するための「ハック」を見つけました。

 import grails.plugin.fixtures.*
 import org.codehaus.groovy.grails.plugins.GrailsPluginManager
 import org.codehaus.groovy.grails.plugins.PluginManagerHolder

 @TestFor(HotelService)
    @Mock([Place])
    class HotelServiceTests {
        def fixtureLoader 
        def grailsApplication

        @Before 
        void setUp() {
            fixtureLoader = new FixtureLoader(grailsApplication)
            PluginManagerHolder.pluginManager = [hasGrailsPlugin: { String name -> true }] as GrailsPluginManager 
        }

        void testFixturesInUnitTests() {
            def fixture = fixtureLoader.build {
                hotel(Place, name: "Hotel Hilton")
            }
        }
    }

今、私は次のエラーを受け取っています:

java.lang.NullPointerException: Cannot invoke method isDomainClass() on null object
    at grails.plugin.fixtures.buildtestdata.BuildTestDataBeanDefinitionTranslator.translate(BuildTestDataBeanDefinitionTranslator.groovy:54)
    at grails.plugin.fixtures.buildtestdata.BuildTestDataBeanDefinitionTranslator.translate(BuildTestDataBeanDefinitionTranslator.groovy:43)
    at grails.plugin.fixtures.builder.FixtureBuilder.translateToBuild(FixtureBuilder.groovy:126)
    at grails.plugin.fixtures.builder.FixtureBuilder.invokeMethod(FixtureBuilder.groovy:121)
    at com.softamo.movilrural.TopRuralScraperServiceTests$_testFixturesInUnitTests_closure2.doCall(TopRuralScraperServiceTests.groovy:26)

私はこれを解決する方法がわかりません。フィードバックは大歓迎です。

4

3 に答える 3

4

このメソッドはBuild Test Data プラグインfixtureLoader.build()と統合されています。フィクスチャ プラグインは、統合テストと組み合わせて使用​​することを目的としています。

このイシューhttp://jira.grails.org/browse/GPFIXTURES-21も参照してください。注釈は test を単位としてマークしている@TestForため、削除する必要があります。

ファイル/test/integration/com.example/HotelServiceTests.groovy

    class HotelServiceTests extends GroovyTestCase {
        FixtureLoader fixtureLoader
        Fixture fixture
        void setUp() {
            fixture = fixtureLoader.load {
                build {
                    hotel(Place, name: "Hotel Hilton")
                }
            }
        }

        void testFixturesInUnitTests() {
            // given:
            HotelService service = new HotelService()
            // when:
            List<Place> hotels = service.list()
            // then:
            assert hotels.size() == 1
            assert hotels[0] == fixture.hotel
        }
    }

お役に立てば幸いです。

于 2013-09-02T14:14:59.947 に答える
0

私はフィクスチャローダーの専門家ではありませんが、間違ったメソッド(loadではなくbuild)を呼び出しているようです。

@TestFor(HotelService)
@Mock([Place])
class HotelServiceTests {
    def fixtureLoader 

    void testFixturesInUnitTests() {
        def fixture = fixtureLoader.load {
            hotel(Place, name: "Hotel Hilton")
        }
    }
}

私は試していませんが、ここでフィクスチャローダーの使用法を見ることができます:Grailsフィクスチャプラグイン-リファレンスドキュメント

于 2013-02-04T11:45:52.483 に答える
0

Grails Unit テストでフィクスチャ プラグインの使用を実際にサポートする方法はありません。

UnitTests をサポートする @Build アノテーションを提供する BuildTestData プラグインを使用して、同じ目標を達成できます。

于 2015-03-25T03:18:07.090 に答える