我有一个测试集成测试,如下所示。
package bibs
import static org.junit.Assert.*
import groovy.util.GroovyTestCase;
import org.junit.*
class BibsServiceTests extends GroovyTestCase{
BibsService service
@Before
void setUp() {
// Setup logic here
}
@After
void tearDown() {
// Tear down logic here
}
@Test
void testSomething() {
assertEquals service.convertRangeStringToRangeList("asd"), "asd"
}
}
当我运行集成测试时,我得到的错误是
Running 1 integration test... 1 of 1
| Failure: testSomething(bibs.BibsServiceTests)
| java.lang.NullPointerException: Cannot invoke method convertRangeStringToRangeList() on null object
at bibs.BibsServiceTests.testSomething(BibsServiceTests.groovy:30)
| Completed 1 integration test, 1 failed in 292ms
| Tests FAILED - view reports in
如果我将服务名称更改为
之外的服务名称BibsService bibsService
然后测试通过。我想知道为什么会这样?谢谢!
答案 0 :(得分:0)
我认为你在单元测试和集成测试之间存在一些混淆。
在针对服务(例如BibsService)编写单元测试时,您可以使用@ grails.test.mixin.TestFor将服务注入到变量" service"下的测试中。
示例:
import grails.test.mixin.TestFor
@TestFor(BibsService)
BibsServiceSpec extends spock.lang.Specification {
void "Test service exists"() {
expect:
null != service
}
}
在编写Integration测试时,Grails使用spring注入来使服务bean可用。这意味着在集成测试中使用服务bean时,您需要服务bean的名称(例如bibsService)。对于Grails服务,这通常是第一个低级的字符,其次是名称的其余部分。
实施例
BibsServiceSpec extends spock.lang.Specification {
// Injected via spring.
BibsService bibsService
... Do test here ...
}