Jacoco的报道误导了测试,使3个控制器陷入困境

Sør*_*vig 5 grails gradle jacoco gradle-plugin grails-3.1

我有一个包含大量控制器的grails 3.1.x项目,我使用spock来测试控制器。

我为控制器使用命令模式,因此每个操作都需要一个命令对象。

这样的控制器的一个例子:

class PlaygroundController {

    public Object pg(PgCO pgco) {
        String s = null
        if (pgco.one) {
            s = pgco.one
        }

        if (pgco.two) {
            s = pgco.two
        }

        render view: 'pg', model: [resultat: s]
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个简单的spock测试案例:

void "pg"() {
        given:
        PgCO pgCO = new PgCO()
        pgCO.one = 'TEST'

        when:
        controller.pg(pgCO)

        then:
        view == '/playground/pg'
        model
        model.resultat == 'TEST'
    }
Run Code Online (Sandbox Code Playgroud)

该测试运行良好,但是当我运行jacocoTestReport时,它表明我的覆盖率远低于50%,因为我只覆盖一个分支,所以没有完全覆盖是可以的。

但是报告中包含我没有源代码的方法上的“缺少的指令”负载。特别是有一个影子pg()方法不带任何参数。Grails会注入此方法,但是由于我使用同一方法的命令对象版本,因此我从不会从测试中调用该方法。这种方法还有来自grails控制器框架的许多其他方法。

是否没有告诉jacoco仅需要检查覆盖范围的“源代码”?

我尝试指定确切的源目录,但这无济于事

这是覆盖率报告的图像: 覆盖率报告

我有一个日常的简单项目,仅启用jacoco插件并运行最新的jacoco:

jacoco {
    toolVersion = "0.7.5.201505241946"
}
Run Code Online (Sandbox Code Playgroud)

还有其他解决方案吗?