繁体   English   中英

Gradle junit-tests 对于在具有相同依赖项的 main 中工作的完全相同的代码失败

[英]Gradle junit-tests are failing for the same exact code that works in main with same dependencies

由于组织限制,我正在使用gradle-2.8版本。

我正在尝试使用以下代码读取 YAML 文件(OpenAPI - swagger 规范):

new OpenAPIParser().readLocation(urlString, null, parseOptions).getOpenAPI();

它按原样存在于main源集中和test源集中。

我已经定义了 2 个配置

  • swagConfig (用于编译时依赖项)
  • swagRuntime (用于运行时依赖项)

其中swagRuntime包含以下依赖项:

'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1'
'com.fasterxml.jackson.core:jackson-databind:2.12.1'
'com.fasterxml.jackson.core:jackson-core:2.12.1'
'com.fasterxml.jackson.core:jackson-annotations:2.12.1'

build.gradle 包括以下内容:

configurations {
    compile.extendsFrom swagConfig
    runtime.extendsFrom swagRuntime
    runtime {
        resolutionStrategy {
            force 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-databind:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-core:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-annotations:2.12.1'
        }
    }
    testRuntime {
        resolutionStrategy {
            force 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-databind:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-core:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-annotations:2.12.1'
        }
    }
}

但是,当我执行我的main源集代码时,它工作得非常好,但是当我运行基于我的test源集的 JUnit 测试时,我遇到了失败:

java.lang.NoSuchMethodError: org.yaml.snakeyaml.events.ScalarEvent.<init>(Ljava/lang/String;Ljava/lang/String;Lorg/yaml/snakeyaml/events/ImplicitTuple;Ljava/lang/String;Lorg/yaml/snakeyaml/error/Mark;Lorg/yaml/snakeyaml/error/Mark;Lorg/yaml/snakeyaml/DumperOptions$ScalarStyle;)V
    at com.fasterxml.jackson.dataformat.yaml.YAMLGenerator._scalarEvent(YAMLGenerator.java:908)
    at com.fasterxml.jackson.dataformat.yaml.YAMLGenerator._writeScalar(YAMLGenerator.java:879)
    at com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.writeNull(YAMLGenerator.java:787)
    at com.fasterxml.jackson.databind.ser.std.NullSerializer.serialize(NullSerializer.java:30)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serializeNull(DefaultSerializerProvider.java:495)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:303)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514)
    at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1085)
    at io.swagger.v3.core.util.Yaml.pretty(Yaml.java:23)
    at io.swagger.v3.parser.converter.SwaggerConverter.readResult(SwaggerConverter.java:113)
    at io.swagger.v3.parser.converter.SwaggerConverter.readLocation(SwaggerConverter.java:91)
    at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)

调试

在进一步调试堆栈跟踪之后,我的猜测是正在使用的jackson-dataformat-yaml工件不知何故不是2.12.1而是2.9或更低,因为在2.9中, org.yaml.snakeyaml.events.ScalarEvent.<init>的构造函数与找不到签名(我也可能是错的)。

我试过打印

  • classpath
  • testRuntime配置及其已解决的工件。

我看到jackson-dataformat-yaml2.12.1版本本身正在被到处使用。 但是我仍然不清楚为什么构建(使用junit)会如上所述失败。

任何人都可以帮助进一步调试这一点,或者了解为什么 JUnits 的test sourceSet 没有正确解析工件。

感谢所有输入。 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM