java忽略junit runner中的签名者信息
一些基本信息,我目前在一个内部系统上工作,该系统使用公司内其他团队制作的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"
}
# 1 楼答案
这在cglib v3中显然是固定的。2.1此提交:https://github.com/cglib/cglib/commit/f9d2f6cef31615d2dd98b3d41ca7de4b6294f2a0
它与mockito发行的393和Spring发行的SPR-12833有关