Вопрос:

Модульное тестирование класса обслуживания Spring Boot с (выходным) репозиторием в JUnit

java spring junit spring-boot

6979 просмотра

1 ответ

751 Репутация автора

Я работаю над веб-сервисом на основе весенней загрузки со следующей структурой:

Контроллер (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': сбой внедрения зависимостей с автопроводкой; вложенное исключение: org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: private com.myApp.SessionRepository com.myApp.SessionService.sessionRepository; вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: не найден квалифицирующий компонент типа [com.myApp.SessionRepository] для зависимости: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматической передачи этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)}

Для полноты: вот моя @Configuration для jpa:

@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(){
  ... 
   }
}
Автор: Alex Источник Размещён: 29.10.2013 09:31

Ответы (1)


0 плюса

897 Репутация автора

В вашем тесте Spring будет использовать конфигурацию только из внутреннего класса ContextConfiguration. Этот класс описывает ваш контекст. В этом контексте вы создали только служебный компонент, а не репозиторий. Таким образом, единственный компонент, который будет создан, это SessionService. Вы должны добавить описание SessionRepository во внутреннюю ContextConfiguration. Ваш класс JpaConfig не будет использоваться в тестовом классе (вы не указываете это), только в приложении.

Автор: mvb13 Размещён: 29.10.2013 10:24
Вопросы из категории :
32x32