在junit runner中忽略签名者信息

时间:2016-03-07 10:31:01

标签: java unit-testing junit spock

一些基本信息,我目前正在使用公司内其他团队制作的罐子的内部系统。

我目前正在为我们的产品添加一些单元测试,但是当我嘲笑其他团队提供的课程时,我遇到了问题。看来他们的罐子已签名,当我试图模拟时,我得到了以下例外情况:

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"
}

1 个答案:

答案 0 :(得分:1)

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

它与模拟的393和Spring的SPR-12833相关联