2

我正在尝试在服务单元测试中使用Grails Fixtures Plugin 。我正在使用 grails 2.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)

另一个谷歌搜索,我发现了一个“黑客”来避免以前的错误。

 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

fixtureLoader.build()方法与Build Test Data 插件集成。固定装置插件旨在与集成测试结合使用。

另请参阅此问题http://jira.grails.org/browse/GPFIXTURES-21。注释将@TestFortest 标记为单元,因此您需要将其删除。

文件/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

我并不是真正的夹具加载器专家,但似乎您只是调用了错误的方法(build而不是load)。

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

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

我还没有尝试过,但是您可以在这里查看夹具加载器的用法:Grails Fixtures Plugin - 参考文档

于 2013-02-04T11:45:52.483 回答
0

没有真正的方法来支持在 Grails 单元测试中使用fixtures 插件。

您可以使用 BuildTestData 插件来实现相同的目标,该插件提供了支持 UnitTests 的 @Build 注释。

于 2015-03-25T03:18:07.090 回答