有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案