5

私は、次の構造を持つスプリング ブート ベースの 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(){
  ... 
   }
}
4

2 に答える 2

0

テストでは、Spring は内部 ContextConfiguration クラスからの構成のみを使用します。このクラスは、コンテキストを説明します。このコンテキストでは、サービス Bean のみを作成し、リポジトリは作成しませんでした。したがって、作成される唯一の Bean は SessionService です。内部 ContextConfiguration に SessionRepository の記述を追加する必要があります。JpaConfig クラスはテスト クラスでは使用されず (これを指定しません)、アプリケーションでのみ使用されます。

于 2013-10-29T10:24:03.393 に答える