![](/img/trans.png)
[英]IllegalAccessError when using a public method reference of a package-private class through a public subclass from another package
[英]IllegalAccessError when accessing package private class in JMock
我已经使用JMock 2.6.0-RC2编写了单元测试,该测试利用了几个程序包私有类。 由于某些原因,这将导致IllegalAccessError
:
java.lang.IllegalAccessError: tried to access class foo.PackagePrivateClass from class $Proxy6
at $Proxy6.getInstance(Unknown Source)
at foo.UsingClass.<init>(UsingClass.java:6)
at foo.FailingTest.testFailure(FailingTest.java:29)
我已经在此处上传了一个最小的Maven项目,以演示该问题: http : //dl.dropbox.com/u/108474287/example-project.zip 。 相关代码也显示在下面(非常简洁)。
为什么在测试中看到错误? 测试类与测试类属于同一包,因此我不希望访问控制成为问题。
一些有趣的观察:
如果我将ExampleInterface
更改为包私有(而不是公共),则问题会消失。 可悲的是,在我的现实生活中,这是不可能的。
仅当我从模拟对象返回值时,才会发生异常。 下载我的示例项目的人将看到另一个测试,该测试返回null
。 这个测试通过了。
如果我将所有类都移到默认包中,则测试通过! 如果所有类都保留在包foo
,则测试将失败。
以下是我的项目中包含的文件。 我上面链接的ZIP是一个小型Maven项目,其中包含所有这些内容。
我还将此问题发布到了JMock开发人员列表中。 如果我在那里收到答案,我将更新此问题(反之亦然)。
FailingTest.java
package foo;
// Imports omitted
@RunWith(JMock.class)
public class FailingTest {
private static final PackagePrivateClass EXAMPLE_INSTANCE =
new PackagePrivateClass();
public Mockery context = new JUnit4Mockery();
@Test
public void testFailure() {
final ExampleInterface exampleInterface = context
.mock(ExampleInterface.class);
context.checking(new Expectations() {
{
oneOf(exampleInterface).getInstance();
will(returnValue(EXAMPLE_INSTANCE));
}
});
new UsingClass(exampleInterface); <-- exception thrown from constructor
}
}
ExampleInterface.java
package foo;
public interface ExampleInterface {
PackagePrivateClass getInstance();
}
PackagePrivateClass.java
package foo;
class PackagePrivateClass {
PackagePrivateClass() {}
@Override
public String toString() {
return "Hello, World!";
}
}
usingClass.java
package foo;
class UsingClass {
UsingClass(ExampleInterface exampleInterface) {
PackagePrivateClass bar = exampleInterface.getInstance(); // <--- exception
System.out.println(bar); // originates here
}
}
为将来的读者提供更新。
目前,我相信这是JMock中的错误。 我已经将其归档在JMock github页面上: https : //github.com/jmock-developers/jmock-library/issues/43 。 尚无回复(我对邮件列表的评论也没有)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.