NPE在单元测试中的grails服务

时间:2016-07-23 04:35:24

标签: unit-testing grails groovy spock

我有一个非常奇怪的错误,希望你能帮助我!我目前正在使用grails 2.5.1。

我的服务是这样的:

@Transactional
abstract class MyParentService {
    AnotherService anotherService
    [...]
    @Transactional(readOnly = true)
    List<Project> allProjects(){
        anotherService.doStuff()
    }
    [...]
}

如果服务不是抽象的,那么结果相同。 然后,我有另一个服务扩展那个:

@Transactional
class MyChildService extends MyParentService {
    def aMethod(){
       List<Projects> projects = allProjects()
       [...]
    }
}

然后我有一个spock单元测试:

@TestFor(MyChildService)
class MyChildServiceSpec extends Specification {
  AnotherService anotherService 
  def setup(){
    anotherService = Mock()
    service.anotherService = anotherService
    List<Project> list = [new Project(a: 1), new Project(a:2)]
    anotherService.doStuff() >> list
  }

  void "do some stuff"(){
    when:
    aMethod()

    then:
    //some asserts
  }
}

当我运行测试时,我在此行中收到NPE错误:

List<Projects> projects = allProjects()

永远不会调用方法allProjects(我添加了一些痕迹,但从未显示过。)

奇怪的是,如果我将“= allProjects()”注释掉,执行测试(当然,因为断言而失败),再次删除注释并再次执行测试,它会通过。但是后来,由于同样的NPE原因,它将再次失败。

使用应用程序执行代码时没有出错,所以它只是一个单元测试的东西

我应该说我有多个服务扩展MyParentService并且所有单元测试都有同样的问题

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我回答我的问题以防其他人来到这里遇到同样的问题。 我没有发现问题,但修复它只是将MyParentService更改为特征,而子代实现它而不是扩展。错误似乎没有再次发生