Unit testing Grails标准在JUnit测试中不起作用

Unit testing Grails标准在JUnit测试中不起作用,unit-testing,grails,junit,grails-2.0,Unit Testing,Grails,Junit,Grails 2.0,我试图在我的grails应用程序中测试搜索方法,但出现了一个空指针异常。我在测试中模拟了该域,如下所示: @TestFor(AuditController) @Mock(Audit) class AuditControllerTests { void testSearch() { populateValidParams(params) def audit=new Audit(params) audit.save(failOnError: true)

我试图在我的grails应用程序中测试搜索方法,但出现了一个空指针异常。我在测试中模拟了该域,如下所示:

  @TestFor(AuditController)
  @Mock(Audit)
  class AuditControllerTests {

void testSearch() {

    populateValidParams(params)
    def audit=new Audit(params)
    audit.save(failOnError: true)

    //Search existing customer
    def model = controller.search()
    assert model.auditInstanceList.size() == 1
    assert model.auditInstanceList.size() == 1

}
  }
我在model.AuditionInstanceList上得到了NPE。它不应该为空。以下是我的控制器中的代码:

def search = {

    def query
    def criteria = Audit.createCriteria()
    def results

    query = {
        and{
            if(params.customerName){
                ilike("customerName", params.customer + '%')
            }
            if(params.siteName){
                ilike("siteName", params.siteName + '%')
            }
            max:params.max
            offset:params.offset


        }
    }

    results = criteria.list(params, query)


    render(view:'list', model:[ auditInstanceList: results,auditInstanceTotal:results.totalCount ])

}

这是怎么回事?

我不知道为什么,但有时您需要将模型作为控制器操作的返回值删除。如果其中一个出现故障,我会交替使用这两个版本:

// sometimes this one works
def model = controller.search()
assert model

// sometimes this one works 
controller.search()
assert model
编辑:我想到了两种新的可能性,为什么你的行动不起作用:

  • 尝试从闭包更改您的操作,并使其成为一种方法
  • 确保没有后过滤器。我发现了这个bug:

  • 搜索
    的末尾返回
    模型
    。如:

    def search = {
      ...
      render(view:'list', model:[ auditInstanceList: results, auditInstanceTotal:results.totalCount ])
    
      [auditInstanceList: results, auditInstanceTotal:results.totalCount]
    }
    

    测试调用
    render()
    的控制器操作时,
    model
    view
    变量将自动创建并在测试中填充。通过执行
    def model=controller.search()
    ,您将用自己的模型替换magic
    model
    ,并将其分配给
    search()
    的返回值。正确的断言方法是:

    controller.search()
    assert model.auditInstanceList.size() == 1
    assert view == '/audit/list'
    

    我不知道。有一些JIRA问题如下:。请检查我的更新答案。