首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powermock UnsatisfiedLinkError

Powermock UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2015-02-24 14:50:51
回答 1查看 2.3K关注 0票数 2

在向我的当前项目(JDK1.6.0)中添加powermock (1.5.6和Easymad3.2)之后,我在测试方法中获得了一些测试失败,这些测试方法在以前非常好地工作:

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

以下代码失败:

代码语言:javascript
复制
BufferedImage img = null;
try {
    img = ImageIO.read(this.getClass().getResourceAsStream("/example.jpg"));
}
catch (IOException e) {
    fail(e.getMessage());
}

powermock页面已经有了2009年的错误,但是没有修复,也没有解决办法。(回到32位是无稽之谈,因为这些方法没有powermock工作)那么有人知道如何修复这个问题吗?

更新I:切换到32位是没有选择的,而且这不是问题所在。如果我不使用PowerMock,那么在我的64位JVM中,每个测试都能很好地工作。

更新II:确定这里是请求的信息

更新III:扩展了类

  1. 待测试的类 导入java.awt.image.BufferedImage;导入java.io.ByteArrayOutputStream;导入java.io.IOException;导入java.security.GeneralSecurityException;导入java.security.cert.X509Certificate;导入javax.imageio.ImageIO;导入sun.security.x509.CertificateIssuerName;导入sun.security.x509.CertificateSubjectName;导入sun.security.x509.X500Name;导入sun.security.x509.X509CertImpl;导入sun.security.x509.X509CertInfo;公共类应用程序{私有X509Certificate证书= null;public ByteArrayOutputStream readImage() { ByteArrayOutputStream baos =新ByteArrayOutputStream();BufferedImage img = null;尝试{ img = ImageIO.read(this.getClass().getResourceAsStream("/example.jpg"));ImageIO.write(img,"png",baos);} catch (IOException e) { e.printStackTrace();}返回baos;}公共字符串readCertificate()抛出异常{ this.certificate = generateCertificate();返回this.certificate.getIssuerX500Principal().getName();}私有静态X509Certificate generateCertificate()抛出GeneralSecurityException,IOException{ X509CertInfo info =新X509CertInfo();X500Name owner = new X500Name("CN=example.net");info.set(X509CertInfo.SUBJECT,new CertificateSubjectName(owner));info.set(X509CertInfo.ISSUER,new CertificateIssuerName(owner));返回新X509CertImpl(info);}}
  2. 测试用例: 导入org.powermock.core.classloader.annotations.PowerMockIgnore;org.junit.Assert;导入org.junit.Test;导入org.junit.runner.RunWith;导入org.junit.Assert导入org.powermock.Modes.Junit4.PowerMockRunner;@RunWith(PowerMockRunner.class) @PrepareForTest(App.class) @PowerMockIgnore("javax.imageio.*,javax.security.*")公共类AppTest { testApp(){ AppTest=新应用程序();Assert.assertNotNull(test.readImage());Assert.assertEquals(284506,test.readImage().size());}@test.readCertificate()抛出异常{ App = new ();test.readCertificate();}}
  3. Maven依赖关系: junit junit 4.11测试org.easymock easymock 3.2测试org.powermock powermock模块-junit4 1.5.6测试org.powermock powermock api-easymock 1.5.6测试

因此,如果您评论行://@RunWith(PowerMockRunner.class),它正在工作。如果取消注释,则引发上述错误(再次!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-04 20:24:16

解决方案是告诉PowerMock忽略与其自定义类加载程序冲突的所有JRE类。也就是说,向测试类添加以下注释:

代码语言:javascript
复制
@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类中的一个本机方法完成的--也许它也试图加载一些本机库)。
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28698895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档