Java 在JMock中访问包私有类时出现IllegaAccessError

Java 在JMock中访问包私有类时出现IllegaAccessError,java,junit,jmock,Java,Junit,Jmock,我已经使用JMock2.6.0-RC2编写了一个单元测试,它使用了几个包私有类。由于某些原因,这会导致出现非法访问错误: java.lang.IllegalAccessError: tried to access class foo.PackagePrivateClass from class $Proxy6 at $Proxy6.getInstance(Unknown Source) at foo.UsingClass.<init>(UsingClass.java:

我已经使用JMock2.6.0-RC2编写了一个单元测试,它使用了几个包私有类。由于某些原因,这会导致出现非法访问错误:

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)
ExampleInterface.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
  }
}
package foo;

public interface ExampleInterface {
  PackagePrivateClass getInstance();
}
package foo;

class PackagePrivateClass {

  PackagePrivateClass() {}

  @Override
  public String toString() {
    return "Hello, World!";
  }
}
package foo;

class UsingClass {

  UsingClass(ExampleInterface exampleInterface) {
    PackagePrivateClass bar = exampleInterface.getInstance(); // <--- exception
    System.out.println(bar);                                  // originates here
  }
}
PackagePrivateClass.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
  }
}
package foo;

public interface ExampleInterface {
  PackagePrivateClass getInstance();
}
package foo;

class PackagePrivateClass {

  PackagePrivateClass() {}

  @Override
  public String toString() {
    return "Hello, World!";
  }
}
package foo;

class UsingClass {

  UsingClass(ExampleInterface exampleInterface) {
    PackagePrivateClass bar = exampleInterface.getInstance(); // <--- exception
    System.out.println(bar);                                  // originates here
  }
}
使用class.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
  }
}
package foo;

public interface ExampleInterface {
  PackagePrivateClass getInstance();
}
package foo;

class PackagePrivateClass {

  PackagePrivateClass() {}

  @Override
  public String toString() {
    return "Hello, World!";
  }
}
package foo;

class UsingClass {

  UsingClass(ExampleInterface exampleInterface) {
    PackagePrivateClass bar = exampleInterface.getInstance(); // <--- exception
    System.out.println(bar);                                  // originates here
  }
}
package-foo;
类使用类{
UsingClass(ExampleInterface ExampleInterface){
PackagePrivateClass bar=exampleInterface.getInstance();//为将来的读者提供更新

目前,我认为这是JMock中的一个bug。我已经在JMock github页面上提交了它:。还没有回复(也没有回复我在邮件列表上的评论)

后来我改用了,它能够毫无差错地处理完全相同的情况