【问题标题】:NPE in grails service within unit test单元测试中 Grails 服务中的 NPE
【发布时间】:2016-11-27 01:13:48
【问题描述】:

我有一个非常奇怪的错误,希望你能帮助我!我目前正在使用 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 并且在所有单元测试中都有同样的问题

有什么想法吗?

【问题讨论】:

    标签: unit-testing grails groovy spock


    【解决方案1】:

    我会回答我的问题,以防其他人遇到同样的问题。 我还没有发现问题,但修复了它,只是将 MyParentService 更改为一个特征,并且孩子们实现它而不是扩展它。错误似乎不再发生

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多