Grails Fixtures / Build Test Data插件在单元测试中不起作用

时间:2013-02-03 09:28:10

标签: grails fixtures

我正在尝试在服务单元测试中使用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 User Mailing List中发现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)

我不知道如何解决这个问题。任何反馈都非常受欢迎。

3 个答案:

答案 0 :(得分:4)

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

另请参阅此问题http://jira.grails.org/browse/GPFIXTURES-21@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
        }
    }

希望它对你有所帮助。

答案 1 :(得分:0)

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

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

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

我还没有尝试过,但您可以在这里查看灯具装载机的使用情况:Grails Fixtures Plugin - Reference Documentation

答案 2 :(得分:0)

在Grails Unit测试中,没有办法支持使用fixtures插件。

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