1

いくつかのパッケージ プライベート クラスを利用する 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にアップロードしました。関連するコードも以下に示します (かなり簡潔です)。

テストでエラーが表示されるのはなぜですか? テストクラスはテスト済みクラスと同じパッケージの一部であるため、アクセス制御が問題になることはないと思います。

いくつかの興味深い観察:

  1. ExampleInterfaceパッケージを (パブリックではなく) プライベートに変更すると、問題は解決します。残念ながら、私の実際のプロジェクトでは、これは不可能です。

  2. 例外は、モック オブジェクトから値を返す場合にのみ発生します。サンプル プロジェクトをダウンロードすると、null返される別のテストが表示されます。このテストはパスします。

  3. すべてのクラスをデフォルト パッケージに移動すると、テストに合格します。すべてのクラスが package に残っている場合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!";
  }
}

Class.java の使用

package foo;

class UsingClass {

  UsingClass(ExampleInterface exampleInterface) {
    PackagePrivateClass bar = exampleInterface.getInstance(); // <--- exception
    System.out.println(bar);                                  // originates here
  }
}
4

1 に答える 1

0

将来の読者のために更新を提供するには....

現在、これは JMock のバグだと思います。JMock github ページにファイルしました: https://github.com/jmock-developers/jmock-library/issues/43。まだ応答がありません (メーリング リストの私のコメントにも)。

それ以来、エラーなしでまったく同じ状況を処理できるMockitoに切り替えました。

于 2013-03-05T09:09:39.860 に答える