一些基本信息,我目前正在使用公司内其他团队制作的罐子的内部系统。
我目前正在为我们的产品添加一些单元测试,但是当我嘲笑其他团队提供的课程时,我遇到了问题。看来他们的罐子已签名,当我试图模拟时,我得到了以下例外情况:
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中禁用安全检查,因为我们的大多数代码都依赖于这个第三方代码,而且我们不能只是恼人地实例化这些类的实例。
我可以确认,如果我从我们正在使用的罐子中删除签名,那么测试就会通过。
要求其他团队不签署他们的罐子是不可行的,我们对我们收到的所有罐子进行反编译是不可行的(通常是30罐,每周一次从服务器安装,但它可以多达一周四次)。我们的测试运行在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"
}
答案 0 :(得分:1)
使用此提交显然已在cglib v3.2.1中修复:https://github.com/cglib/cglib/commit/f9d2f6cef31615d2dd98b3d41ca7de4b6294f2a0