Grails:将插件类导入_Events.groovy

时间:2012-11-11 04:13:17

标签: grails groovy classpath

我创建了一个Grails插件,它添加了一个自定义测试类型类(扩展GrailsTestTypeSupport)和自定义测试结果类(扩展GrailsTestTypeResult),以支持我在{期间运行的自定义测试类型{1}}脚本的{1}}阶段。在我的本地机器上进行测试已经过时了但是......

当我打包插件以在我的应用程序中使用时,测试正在爆炸我们的CI服务器(Jenkins)。这是詹金斯吐出的错误:

other

看来我不能简单test-app将这些类转换为unable to resolve class CustomTestResult @ line 58, column 9. new CustomTestResult(tests.size() - failed, failed) ,并且类不在类路径中。但如果我能弄明白如何让他们进入类路径,我会被诅咒。这是我到目前为止(import):

_Events.groovy

目前:_Events.groovy仅在import java.lang.reflect.Constructor eventAllTestsStart = { if (!otherTests) otherTests = [] loadCustomTestResult() otherTests << createCustomTestType() } private def createCustomTestType(String name = 'js', String relativeSourcePath = 'js') { ClassLoader parent = getClass().getClassLoader() GroovyClassLoader loader = new GroovyClassLoader(parent) Class customTestTypeClass = loader.parseClass(new File("${customTestPluginDir}/src/groovy/custom/test/CustomTestType.groovy")) Constructor customTestTypeConstructor = customTestTypeClass.getConstructor(String, String) def customTestType = customTestTypeConstructor.newInstance(name, relativeSourcePath) customTestType } private def loadCustomTestResult() { ClassLoader parent = getClass().getClassLoader() GroovyClassLoader loader = new GroovyClassLoader(parent) Class customTestResultClass = loader.parseClass(new File("${customTestPluginDir}/src/groovy/custom/test/CustomTestResult.groovy")) } 内引用。据我所知,CustomTestResult正在加载CustomTestType,但它失败了,因为它坚持认为_Events.groovy不在类路径上。

暂时搁置一下,看起来很疯狂,将插件提供的类放到类路径上以便开始测试周期......我不太确定我在哪里被绊倒了。任何帮助或指示将不胜感激。

2 个答案:

答案 0 :(得分:1)

您是否曾尝试通过可通过classLoader中的_Events.groovy变量访问的ClassLoader加载相关课程?

Class customTestTypeClass = classLoader.loadClass('custom.test.CustomTestType')
// use nice groovy overloading of Class.newInstance
return customTestTypeClass.newInstance(name, relativeSourcePath)

你应该在eventAllTestsStart的过程中迟到才能使其有效。

答案 1 :(得分:1)

@Ian Roberts' answer让我指出了大致正确的方向,并结合this grails-cucumber plugin_Events.groovy脚本,我设法得到了这个解决方案:

首先,_Events.groovy成了这个:

eventAllTestsStart = { if (!otherTests) otherTests = [] }

eventTestPhasesStart = { phases ->
  if (!phases.contains('other')) { return }

  // classLoader.loadClass business per Ian Roberts:
  otherTests << classLoader.loadClass('custom.test.CustomTestType').newInstance('js', 'js')
}

这比我在这个帖子开头时的可读性要高得多。但是:我处于大致相同的位置:当ClassNotFoundException尝试创建_Events.groovy的实例时,CustomTestType从被custom.test. CustomTestResult投掷到被CustomTestType内投掷。所以在private GrailsTestTypeResult createResult(passed, failed) { try { return new customTestResult(passed, failed) } catch(ClassNotFoundException cnf) { Class customTestResult = buildBinding.classLoader.loadClass('custom.test.CustomTestResult') return customTestResult.newInstance(passed, failed) } } 中,我添加了以下方法:

classLoader

所以Ian是对的,因为{{1}}来救援 - 我只是在两个地方需要它的魔法。