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;
}
}
問題は、@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 {
...
}