我创建了一个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
不在类路径上。
暂时搁置一下,看起来很疯狂,将插件提供的类放到类路径上以便开始测试周期......我不太确定我在哪里被绊倒了。任何帮助或指示将不胜感激。
答案 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}}来救援 - 我只是在两个地方需要它的魔法。