【问题标题】:Why are my unit tests not working?为什么我的单元测试不起作用?
【发布时间】:2013-11-17 19:49:27
【问题描述】:

我有一个相当简单的 Grails 单元测试:

@TestFor(DateTimeTagLib)
class DateTimeTagLibSpec extends Specification {
    def setup() {
    }

    def cleanup() {
    }

    void "showTime"() {
        assertEquals "14:26", new DateTimeTagLib().showTime(value: DateTime.parse("2013-01-01 14:26:00")).toString()
    }
}

当我尝试使用 IntelliJ Idea 13 EAP 中的“运行”启动它时,我得到:

java.lang.NullPointerException
at grails.test.mixin.support.GrailsUnitTestMixin.shutdownApplicationContext(GrailsUnitTestMixin.groovy:266)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

GrailsUnitTestMixin 中有问题的行是:

     static void shutdownApplicationContext() {
         if (applicationContext.isActive()) { <-- this one

当我使用grails test-app unit: 或grails test-app :spock 启动它时,我得到:

| Tests PASSED - view reports in C:\projects\MyProject\target\test-reports

但是 - 那里的报告实际上显示 No tests executed.,尽管测试位于 /test/unit/mypackage/ 中,它是由 Grails 自动创建的。如果我在测试中添加一个打印语句,它也不会被执行。

我做错了什么?


编辑 - Burt Beckwith 建议我的单元测试是错误的。他是对的,但这实际上并不能完全解决我遇到的问题:/

    void "showTime"() {
        given:
            print 'executing'
            def taglib = new DateTimeTagLib()

        expect:
            "14:26" == taglib.showTime(value: DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("2013-01-01 14:26:00")).toString()
    }

得到

executing
java.lang.NullPointerException
at grails.test.mixin.support.GrailsUnitTestMixin.shutdownApplicationContext(GrailsUnitTestMixin.groovy:266)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

无论是由于这个原因还是其他原因,我在命令行test-app :spock 中也得到了不同的行为。

grails> test-app :spock
| Error An error occurred installing the plugin [webdriver-0.4.2]: Unable to delete file C:\projects\myproject\target\work\plugins\webdriver-0.4.2\lib\webdriver-ast-transforms.jar
| Error Error running script test-app :spock: org.codehaus.groovy.grails.cli.ScriptExitException (Use --stacktrace to see the full trace)

编辑 #2 - 在构建配置中注释掉 webdriver / 重新启动 grails / clean-all 有助于解决最后一个问题,但 test-app :spock 仍然显示为“未执行测试。”在 HTML 报告中。

【问题讨论】:

    标签: unit-testing grails spock


    【解决方案1】:

    这是一项 Spock 测试,测试方法必须具有一个或多个标记块才能被视为测试方法。将类重命名为以“Tests”结尾并扩展 GroovyTestCase(或其子类)以使用 JUnit 3,或不扩展任何内容以使用 JUnit 4。或者将测试转换为 Spock 格式:

    void "showTime"() {
       given:
          def taglib = new DateTimeTagLib()
    
       expect:
          "14:26" == taglib.showTime(value: DateTime.parse("2013-01-01 14:26:00")).toString()
    }
    

    【讨论】:

    • Burt,谢谢,这很有帮助,但仍然不能真正解决我的问题:(
    • +1:我今天被这个咬了,试图弄清楚为什么我的 Spock 测试拒绝失败,即使使用像“assert 1 == 2”这样的行。结果我没有标记块,Spock 只是忽略了它。相当令人沮丧...
    【解决方案2】:

    我在 IntegrationSpec 上使用 @TestFor 时遇到了这个错误。相反,使用:

    class MyControllerSpec extends IntegrationSpec {
        @Autowired
        MyController controller
    
        void "my controller does something"() {
            ...
        }
    }
    

    确保您在 /unit 测试路径中使用 Specification,在 /integration 路径中使用 IntegrationSpec。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多