黄瓜JVM(Groovy)“世界(Hooks)”对象mixin和Intellij导航

时间:2013-06-17 23:44:24

标签: groovy intellij-idea cucumber-jvm

我正在使用intellij中的Cucumber JVM(Groovy)开发黄瓜场景。事情要比在日食中做同样的事情要好得多。

我想解决一个小问题,让我的团队做得更好。但由于我是Intellij的新手,所以我需要以下帮助:

  • 当我处于步骤def文件(groovy)时,Intellij似乎无法看到黄瓜“World”对象中定义的变量和方法。所以不要为那些有点烦人的人提供IDE支持(自动完成等)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

IntelliJ IDEA希望World封闭中包含一个对象。因此,您可以在每个步骤定义文件中定义以下块:

World {
    new MockedTestWorld()
}

MockedTestWorld.groovy:

class MockedTestWorld implements TestWorld {
    @Lazy
    @Delegate
    @SuppressWarnings("GroovyAssignabilityCheck")
    private TestWorld delegate = {
        throw new UnsupportedOperationException("" +
            "Test world mock is used ONLY for syntax highlighting in IDE" +
            " and must be overridden by concrete 'InitSteps.groovy' implementation.")
    }()
}

为清除重复的世界定义,我们使用了上胶初始化程序和一些复制粘贴:

real / InitSteps.groovy

def world
GroovyBackend.instance.@worldClosures.clear()
GroovyBackend.instance.registerWorld {
    return world ?: (world = new RealTestWorld1()) // Actual initialization is much longer
}

legacy / InitSteps.groovy

def world
GroovyBackend.instance.@worldClosures.clear()
GroovyBackend.instance.registerWorld {
    return world ?: (world = new LegacyTestWorld1())
}

最后,运行配置如下(使用不同的胶水):

// Real setup
glue = { "classpath:test/steps", "classpath:test/real", },

// Legacy setup
glue = { "classpath:test/steps", "classpath:test/legacy", },