为什么我的单元测试不起作用?

时间:2013-11-17 19:49:28

标签: unit-testing grails spock

我有一个相当琐碎的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中的'Run'启动它时,我得到:

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.,Grails会自动创建,但实际显示/test/unit/mypackage/的报告仍显示 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() } 。如果我在测试中添加一个print语句,它也不会被执行。

我做错了什么?


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

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) 中也会遇到不同的行为。

clean-all

编辑#2 - 在构建配置/重新启动grails / test-app :spock中注释掉webdriver有助于上一期,但{{1}}仍显示为“未执行测试。”在HTML报告中。

2 个答案:

答案 0 :(得分:4)

这是一个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()
}

答案 1 :(得分:1)

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

class MyControllerSpec extends IntegrationSpec {
    @Autowired
    MyController controller

    void "my controller does something"() {
        ...
    }
}

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