Java 忽略junit runner中的签名者信息

Java 忽略junit runner中的签名者信息,java,unit-testing,junit,spock,Java,Unit Testing,Junit,Spock,一些基本信息,我目前在一个内部系统上工作,该系统使用公司内其他团队制作的JAR 我目前正在为我们的产品添加一些单元测试,但是当我模拟其他团队提供的类时,我发现了一些问题。似乎他们的JAR已签名,当我尝试模拟时,会出现以下异常: Caused by: java.lang.SecurityException: class "com.example.MyClass$$FastClassByCGLIB$$730dfe4e"'s signer information does not match sign

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

我目前正在为我们的产品添加一些单元测试,但是当我模拟其他团队提供的类时,我发现了一些问题。似乎他们的JAR已签名,当我尝试模拟时,会出现以下异常:

Caused by: java.lang.SecurityException: class "com.example.MyClass$$FastClassByCGLIB$$730dfe4e"'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,每周从服务器安装一次,但每周可能多达4次)。我们的测试在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中通过以下提交明显得到了修复:


它与mockito和Spring的问题有关

这是单元测试的输出?您是否使用容器进行测试?你为什么不把瓶子上的签名去掉?如果你真的在模仿这些类,那么为什么会出现这个错误呢?请发布你的Spock测试代码。我已经在上面的问题中添加了更多的细节,但是我觉得这并不能帮助解决这个难题。我们在Mock上得到异常的原因是,Mock将不具有与它所基于的类相同的签名。所以Java正在做我期望的事情。显然Jeremie B在您的编辑之后找到了解决方案。