我正在尝试在服务单元测试中使用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)
我不知道如何解决这个问题。任何反馈都非常受欢迎。
答案 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注释。