gpt4 book ai didi

java - Powermock imageio 不满意链接错误

转载 作者:行者123 更新时间:2023-12-02 14:06:05 25 4
gpt4 key购买 nike

将 powermock(1.5.6 与 Easymock 3.2 结合)添加到我当前的项目(jdk 1.6.0)后,我在测试方法中遇到了一些测试失败,这些测试方法之前工作得很好:

java.lang.UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageReader.initReaderIDs(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V

以下代码失败:

BufferedImage img = null;
try {
img = ImageIO.read(this.getClass().getResourceAsStream("/example.jpg"));
}
catch (IOException e) {
fail(e.getMessage());
}

powermock页面已经有一个bug从 2009 年开始,但没有修复也没有解决方法。 (回到 32 位是无意义的,因为这些方法无需 powermock 即可工作)那么有人知道如何解决这个问题吗?

更新 I: 无法切换到 32 位,而且这也不是问题。如果我不使用 PowerMock,每个测试都可以在我的 64 位 JVM 中完美运行...

更新 II: 好的,这是所需的信息

更新 III:扩展了类

  1. 待测试的类

    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.security.cert.X509Certificate;
    import javax.imageio.ImageIO;
    import sun.security.x509.CertificateIssuerName;
    import sun.security.x509.CertificateSubjectName;
    import sun.security.x509.X500Name;
    import sun.security.x509.X509CertImpl;
    import sun.security.x509.X509CertInfo;

    public class App {
    private X509Certificate certificate = null;

    public ByteArrayOutputStream readImage() {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    BufferedImage img = null;
    try {
    img = ImageIO.read(this.getClass().getResourceAsStream("/example.jpg"));
    ImageIO.write(img, "png", baos);
    }
    catch (IOException e) {
    e.printStackTrace();
    }

    return baos;
    }

    public String readCertificate() throws Exception{
    this.certificate = generateCertificate();
    return this.certificate.getIssuerX500Principal().getName();
    }

    private static X509Certificate generateCertificate() throws GeneralSecurityException, IOException{
    X509CertInfo info = new X509CertInfo();
    X500Name owner = new X500Name("CN=example.net");
    info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
    info.set(X509CertInfo.ISSUER, new CertificateIssuerName(owner));
    return new X509CertImpl(info);
    }
    }
  2. 测试用例:

    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.core.classloader.annotations.PowerMockIgnore;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(App.class)
    @PowerMockIgnore("javax.imageio.*, javax.security.*")
    public class AppTest {

    @Test
    public void testApp(){
    App test = new App();
    Assert.assertNotNull(test.readImage());
    Assert.assertEquals(284506, test.readImage().size());
    }
    @Test
    public void testCertificate() throws Exception{
    App test = new App();
    test.readCertificate();
    }
    }
  3. Maven 依赖项:

    <dependencies>
    <!-- TEST -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.easymock</groupId>
    <artifactId>easymock</artifactId>
    <version>3.2</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.5.6</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-easymock</artifactId>
    <version>1.5.6</version>
    <scope>test</scope>
    </dependency>

因此,如果您注释该行://@RunWith(PowerMockRunner.class)这是工作。如果取消注释,则会抛出上述错误(再次!)

最佳答案

解决方案是告诉 PowerMock 忽略与其自定义类加载器冲突的所有 JRE 类。即在测试类中添加如下注解:

@PowerMockIgnore({"javax.imageio.*", "javax.security.*"})

(请注意,注释的 value 属性采用正则表达式的数组;它不支持单个字符串中的多个逗号分隔表达式。)

为什么需要这样做的解释是

  1. PowerMock 通过在其自己的自定义类加载器中重新加载准备好的类(以及测试类)来进行操作;
  2. App调用javax.imageio.ImageIO时,它最终会尝试加载并初始化内部类com.sun.imageio.plugins.jpeg .JPEGImageReader,然后尝试从调用者类加载器加载一些其他com.sun.imageio类;和
  3. 类加载失败,因为 PowerMock 的自定义类加载器显然无法找到那些 JRE 类(很难准确判断此时发生了什么,因为加载是由 JPEGImageReader 中的 native 方法完成的) > 类 - 也许它也尝试加载一些 native 库)。

关于java - Powermock imageio 不满意链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28698895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com