web-dev-qa-db-ja.com

テスト外のクラスが必要な@DataJpaTest

SpringBootアプリケーションで、リポジトリレイヤーについていくつかのテストを実行したいと思います。

@RunWith(SpringRunner.class)
@DataJpaTest
public class VisitRepositoryTest {

     @Autowired
     private TestEntityManager entityManager;

     @Autowired
     private VisitRepository visitRepository;

     ...
}

VisitRepositoryTestからテストを実行しようとすると、DefaultConfigServiceに関するエラーが表示されます

Com.norc.ApplicationのフィールドdefaultConfigServiceには、タイプ「com.norc.service.DefaultConfigService」のBeanが必要でしたが、見つかりませんでした。

これはApplicationを実行する必要がありますか?

DefaultConfigServiceのBeanをVisitRepositoryTestに入れようとしましたが、許可されていません。

このクラスは私のアプリで使用されています

@EntityScan(basePackageClasses = {Application.class, Jsr310JpaConverters.class})
@SpringBootApplication
@EnableScheduling
public class Application implements SchedulingConfigurer {

      @Autowired
      private DefaultConfigService defaultConfigService;
      ...
}

それを管理する方法は?


編集する

私のアプリケーションでは、このクラスをcronタブで使用します。

@Service
public class DefaultConfigServiceImpl implements DefaultConfigService {

    private final DefaultConfigRepository defaultConfigRepository;

    @Autowired
    public DefaultConfigServiceImpl(final DefaultConfigRepository defaultConfigRepository) {
         this.defaultConfigRepository = defaultConfigRepository;
    }
}
17
robert trudel

問題は、@SpringBootApplicationにスケジューリングに関する追加の構成があり、テストにカスタム@SpringBootConfigurationがないことを追加することで、そのようなスケジューリング要件がすべてに必須になることです。

一歩後ろに戻りましょう。 @DataJpaTestを追加するとき、Spring Bootはbootstrapアプリケーションコンテキストを知る方法を知る必要があります。エンティティとリポジトリを見つける必要があります。スライステストは再帰的に@SpringBootConfiguration:を検索します。実際のテスト、次に親、次に親、そしてそれが見つからない場合は例外がスローされます。

@SpringBootApplication@SpringBootConfigurationであるため、特別なことを何も行わない場合、スライステストはアプリを構成のソースとして使用します(これはIMOであり、優れたデフォルトです)。

スライステストはアプリを盲目的に起動しません(それ以外の場合はスライスされません)ため、自動構成を無効にして、手元のタスクのコンポーネントスキャンをカスタマイズします(@DataJpaTestを使用する場合、エンティティとリポジトリのみをスキャンし、残りをすべて無視します) )。アプリケーションの構成が適用され、スケジュールに関するものが利用できるはずなので、それはあなたにとって問題です。ただし、依存Beanはスキャンされません。

あなたの場合、スライシングを使用したい場合、スケジュール設定はSchedulingConfigurationまたは何かに移動する必要があります(上記で説明したように、スライシングでスキャンされません)。とにかく、私はSchedulingConfigurer実装をとにかく分離するほうがきれいだと思います。これを行うと、エラーが解消されることがわかります。

この特定のテストでFooServiceも使用できると仮定します。 dimitrisliが提案するようにコンポーネントスキャンを有効にする(基本的には構成のスライスを無効にする)のではなく、不足しているクラスをインポートするだけで済みます。

@RunWith(SpringRunner.class)
@DataJpaTest
@Import(FooService.class)
public class VisitRepositoryTest {
  ...
}
52
Stephane Nicoll