我有一个相当琐碎的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报告中。
答案 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。