忽略 junit runner 中的签名者信息

Ignoring signer information in junit runner

一些基本信息,我目前在一个内部系统上工作,该系统使用公司内其他团队制作的jar。

我目前正在为我们的产品添加一些单元测试,但是在模拟由其他团队提供的 类 时我遇到了问题。看来他们的罐子已经签名了,当我尝试模拟时,我得到了这些异常:

Caused by: java.lang.SecurityException: class "com.example.MyClass$$FastClassByCGLIB$0dfe4e"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:895)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:665)
at java.lang.ClassLoader.defineClass(ClassLoader.java:758)

显然,出于安全原因,这似乎是有道理的。我只是想知道是否可以在 junit runner/jvm 中禁用安全检查,因为我们的大部分代码都依赖于这个第三方代码,我们不能只实例化这些 类 烦人。

我可以确认,如果我从我们正在使用的 jar 中删除签名,那么测试就会通过。

要求其他团队不签署他们的 jar 是不可行的,对我们来说反编译我们收到的所有 jar 也是不可行的(通常是 30 个 jar,每周从服务器安装一次,但它可以是每周多达四次)。我们在 CI 上测试 运行,因此我们将不得不使用条件(例如 @IgnoreIf)来忽略依赖于这些签名 jar 的 CI 上的测试,从而大大减少 运行宁CI.

我们的开发实践可能看起来并不理想,但由于组织的规模。这些不会改变。

额外信息:我们使用普通的旧 Spock 与 CGLIB 进行单元测试,以提供下面的模拟示例测试。我在 jar 签名时看到上面的异常,而在 jar 未签名时测试通过

def "My Test"() {

    given:
    def myClass= Mock(MyClass)

    when:
    def string = new String("hello")

    then:
    string == "hello"
}

这显然已通过此提交在 cglib v3.2.1 中修复:https://github.com/cglib/cglib/commit/f9d2f6cef31615d2dd98b3d41ca7de4b6294f2a0

它与 Spring

的问题 393 for mockito and SPR-12833 相关联