Grails测试:无法获取null对象的属性

时间:2014-06-12 17:11:44

标签: grails

我正在为没有输入和渲染语句的控制器部分编写集成测试 - 所以我不确定我做错了什么但是这会抛出“无法获取属性'appMessages'在null对象上”错误。我对测试很陌生,所以有时候我会想念看似简单的事情。 :)

测试:

@Test
void "test welcome"() {
    def ncpic = new IndexController()
    def model = ncpic.welcome()
    assertEquals 'welcome', model.appMessages.results       
}

控制器部分:

@Transactional(readOnly = true)
def welcome() {
    def crit = ApplicationMessage.createCriteria()
    def results = crit.listDistinct{
        or{
            isNull('messageInactivationDate')
            gt('messageInactivationDate', (new Date())) 
        } 
        lt('messageDate', new Date())
    }
    render(view:'welcome', model:[appMessages:results]) 
}

2 个答案:

答案 0 :(得分:1)

您的测试有几个问题。一个是你不应该创建自己的控制器实例。你应该让测试框架为你做这件事。其次,你期待你的欢迎行动返回模型,但事实并非如此。它调用render方法。像下面这样的东西应该工作。这恰好是使用Spock Spec,但你可以在JUnit测试中做同样的事情......

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(IndexController)
@Mock(ApplicationMessage)
class IndexControllerSpec extends Specification {

    void "test something"() {
        when:
        controller.welcome()

        then:
        'welcome' == model.appMessages.results
    }
}

我希望有所帮助。

编辑:以下是JUnit示例...

import grails.test.mixin.TestFor

@TestFor(IndexController)
@Mock(ApplicationMessage)
class IndexControllerTests {

    @Test
    void testSomething() {
        controller.welcome()

        // this assertion is still suspect, but that isn't
        // really what the question is about...
        assertEquals 'welcome', model.appMessages.results
    }
}

这里的相关位是指test mixin添加到此类的model属性。在给定控制器操作的方式的情况下,您不能引用welcome方法的返回值。该操作写得很好,但测试需要以与其兼容的方式编写,如上所示。

答案 1 :(得分:0)

我通常会测试:

import grails.test.spock.IntegrationSpec

class FirstControllerSpec extends IntegrationSpec {

  FirstController controller

  def setup() {
    controller = new FirstController()
  }

  def cleanup() {
  }

  void "test something"() {
    when:
    controller.welcome()

    then:
    assert controller.modelAndView.viewName == "/first/welcome"
    assert controller.modelAndView.model.size() == 1
    assert controller.modelAndView.model.appMessages != null
  }
}