6

Spring Roo プロジェクトの JUnit テストを作成しようとしています。テストでエンティティ クラスを使用する必要がある場合、次の例外が発生します。

java.lang.IllegalStateException: Entity manager has not been injected 
(is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)

Spring Aspects JAR は正しく構成されているようです。特に、pom.xmlファイルには次のものがあります。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
</dependency>

<plugin>
  <configuration>
  <outxml>true</outxml>
  <aspectLibraries>
    <aspectLibrary>
      <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
    </aspectLibrary>
  </aspectLibraries>
  <source>1.6</source>
  <target>1.6</target>
  </configuration>
</plugin>

エンティティ クラスを使用するクラスは、JUnit テストから呼び出されない場合は正常に動作します。エンティティ マネージャが JUnit テストから挿入されるように設定する方法を教えてください。

これが私のテストクラスです(多かれ少なかれ):

public class ServiceExampleTest {

  @Test
  public void testFoo() {
    FooService fs = new FooServiceImpl();
    Set<Foo> foos = fs.getFoos();
  }
}

これは、例外をスローするのに十分です。FooServiceImpl クラスは Foo の Set を返します。Foo はエンティティ クラスです。このgetFoos()メソッドは、アプリケーションが通常の方法で実行されている場合に機能します。問題は単体テストのコンテキストでのみ発生します。

4

7 に答える 7

6

ポンザオは正しいです。テスト クラスに AbstractJunit4SpringContextTests を拡張させることで、すべてのスプリング インジェクション マジックを利用できます。

例えば

@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })
public class SelfRegistrationTest extends AbstractJUnit4SpringContextTests {
于 2010-11-11T17:08:27.983 に答える
3

これは、Spring Roo の非常に厄介な問題であり、私は公式の解決策を見つけていません。

しかし ... 2 つの回避策があります。

  • spring-aspects jar をプロジェクトにコピーし、それを Projects AspectJ Aspect Path に追加します
  • Maven を使用して単体テストを実行します (緑色のバーを見逃す:( )

オプション 1 では、プロジェクトを右クリックして、[プロパティ] -> [AspectJ ビルド] -> [アスペクト パス] タブを選択します。

于 2010-11-07T22:46:18.887 に答える
3

単体テスト クラスには @MockStaticEntityMethods アノテーションが必要です。

@migueによる上記の回答に詳細を追加したかっただけです。それを機能させる方法を理解するのに時間がかかったからです。サイトhttp://java.dzone.com/articles/mock-static-methods-using-spring-aspectsは、以下の答えを導き出すのに本当に役立ちました。

テストクラスを介してエンティティマネージャーを注入するために私がしたことは次のとおりです。まず、テスト クラスに @MockStaticEntityMethods のアノテーションを付け、MockEntityManager クラス (EntityManager インターフェースを実装するだけのクラス) を作成します。

次に、ServiceExampleTest テスト クラスで次のことを実行できます。

@Test
public void testFoo() {
  // call the static method that gets called by the method being tested in order to
  // "record" it and then set the expected response when it is replayed during the test
  Foo.entityManager();
  MockEntityManager expectedEntityManager = new MockEntityManager() {
    // TODO override what method you need to return whatever object you test needs
  };
  AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedEntityManager);

  FooService fs = new FooServiceImpl();
  Set<Foo> foos = fs.getFoos();
}

これは、 fs.getFoos() を呼び出したときに、 Foo.entityManager() が静的メソッドであるため、AnnotationDrivenStaticEntityMockingControl がモック エンティティ マネージャーを注入したことを意味します。

また fs.getFoos() が Foo や Bar などのエンティティ クラスの他の静的メソッドを呼び出す場合、それらもこのテスト ケースの一部として指定する必要があることに注意してください。

たとえば、Foo に "getAllBars(Long fooId)" という静的検索メソッドがあり、fs.getFoos() が呼び出されたときに呼び出されるとします。この場合、AnnotationDrivenStaticEntityMockingControl を機能させるには、次の手順を実行する必要があります。

@Test
public void testFoo() {
  // call the static method that gets called by the method being tested in order to
  // "record" it and then set the expected response when it is replayed during the test
  Foo.entityManager();
  MockEntityManager expectedEntityManager = new MockEntityManager() {
    // TODO override what method you need to return whatever object you test needs
  };
  AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedEntityManager);

  // call the static method that gets called by the method being tested in order to
  // "record" it and then set the expected response when it is replayed during the test
  Long fooId = 1L;
  Foo.findAllBars(fooId);
  List<Bars> expectedBars = new ArrayList<Bar>();
  expectedBars.add(new Bar(1));
  expectedBars.add(new Bar(2));
  AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedBars);

  FooService fs = new FooServiceImpl();
  Set<Foo> foos = fs.getFoos();
}

AnnotationDrivenStaticEntityMockingControl は、 fs.getFoos() がその静的メソッドを呼び出すのと同じ順序でなければならないことに注意してください。

于 2012-11-14T15:25:09.567 に答える
1

単体テスト クラスには @MockStaticEntityMethods アノテーションが必要です。

于 2010-11-16T14:03:09.937 に答える
0

私も同じ例外に遭遇し、すべてが正しく構成されました。プロジェクトを削除してSTS(SpringSource Tool Suite)に再インポートすると、この問題は解決しました。

これで修正された理由はわかりませんが、この問題は、私の場合、STSに切り替える前にEclipseを使用してRooで生成されたプロジェクトを管理したことが原因である可能性があります。

于 2011-05-08T09:09:25.067 に答える