2

Spring Rest Docs を使用して、REST サービスのドキュメントを生成しています。これには、テストによって開始されるライブ Spring Boot コンテナーに対して実行されるユニット (厳密には統合) テストの実行が含まれます。テストクラスは次のようになります。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MySpringConfiguration.class)
@WebAppConfiguration
public class ApiDocumentation {

  private MockMvc mockMvc;

  @Rule
  public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("target/generated-snippets");

  @Autowired
  private WebApplicationContext context;

  @Autowired
  private ObjectMapper objectMapper;

  @Before
  public void setUp() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
            .apply(documentationConfiguration(this.restDocumentation))
            .build();
  }


  @Test
  public void testSomething() throws Exception {
  }
}

アプリケーションは、EntityManager の実装に EclipseLink で JPA を使用します。

テストを IDE でスタンドアロンで実行するか、maven-surefire-plugin を使用して Maven ビルドを実行するときに存在する唯一のテストとして実行すると、すべて正常に動作します。

ただし、スイートで実行したいテストはこれだけではありません。スイートで他のテストを実行するとすぐに、ここで言及されている問題に遭遇します。

「Spring のエージェントは、アプリケーションが Spring コンテキストにアクセスするまで永続化コンテキストを初期化しません。アプリケーションが Spring コンテキストにアクセスする前に永続化クラスのロードをすでにトリガーしている場合、ウィービングは発生しません。」

次のようなエラーが発生します。

例外の説明: メソッド [_persistence_set_someField_vh] または [_persistence_get_someField_vh] がオブジェクト [mypackage.MyEntity] で定義されていません。

では、人々は通常、これを回避するために何をしているのでしょうか? 別のモジュールで SpringBootTest クラスを実行して、エンティティにアクセスする単体テストを行いますか?

4

2 に答える 2