私は、次の構造を持つスプリング ブート ベースの Web サービスに取り組んでいます。
コントローラ (REST) --> サービス --> リポジトリ (いくつかのチュートリアルで提案されているように)。
私のデータベース接続 (JPA/Hibernate/MySQL) は @Configuration クラスで定義されています。(下記参照)
Service クラスのメソッドの簡単なテストを書きたいのですが、ApplicationContext をテスト クラスにロードする方法と、JPA / リポジトリをモックする方法がよくわかりません。
これは私がどこまで来たかです:
私のサービスクラス
@Component
public class SessionService {
@Autowired
private SessionRepository sessionRepository;
public void MethodIWantToTest(int i){
};
[...]
}
私のテストクラス:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class SessionServiceTest {
@Configuration
static class ContextConfiguration {
@Bean
public SessionService sessionService() {
return new SessionService();
}
}
@Autowired
SessionService sessionService;
@Test
public void testMethod(){
[...]
}
}
しかし、次の例外が発生します。
原因: org.springframework.beans.factory.BeanCreationException: 'sessionService' という名前の Bean の作成中にエラーが発生しました: 自動配線された依存関係の注入に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.myApp.SessionRepository com.myApp.SessionService.sessionRepository; です。ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualing bean of type [com.myApp.SessionRepository] が依存関係に見つかりません: この依存関係のオートワイヤー候補として適格な少なくとも 1 つの Bean が必要です。依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
完全を期すために:ここにjpaの@Configurationがあります:
@Configuration
@EnableJpaRepositories(basePackages={"com.myApp.repositories"})
@EnableTransactionManagement
public class JpaConfig {
@Bean
public ComboPooledDataSource dataSource() throws PropertyVetoException, IOException {
...
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
...
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
...
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
...
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
...
}
}