2016-07-23 80 views
0

我有一个很奇怪的错误,希望你能帮助我!我目前正在使用grails 2.5.1。NPE在单元测试中的grails服务

我的服务是这样的:

@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() 
     [...] 
    } 
} 

然后,我有一个斯波克单元测试:

@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多个服务,并与所有单元同样的问题测试

任何想法?

回答

0

我回答我的问题,以防万一其他人来这里出现同样的问题。 我还没有找到问题,但修复它只是改变MyParentService是一个特质和儿童实现它而不是扩展。错误似乎不再发生