为什么命名服务"服务"不能在集成测试中工作?

时间:2016-11-24 07:24:35

标签: grails integration-testing

我有一个测试集成测试,如下所示。

  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

然后测试通过。我想知道为什么会这样?谢谢!

1 个答案:

答案 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 ...
}