Я работаю над веб-сервисом на основе весенней загрузки со следующей структурой:
Контроллер (REST) -> Службы -> Репозитории (как предлагается в некоторых руководствах).
Подключение к моей базе данных (JPA / Hibernate / MySQL) определяется в классе @Configuration. (см. ниже)
Теперь я хотел бы написать простые тесты для методов в моих классах обслуживания, но я действительно не понимаю, как загружать 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: ошибка создания bean-компонента с именем 'sessionService': не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить поле: private com.myApp.SessionRepository com.myApp.SessionService.sessionRepository; вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не найдено подходящего bean-компонента типа [com.myApp.SessionRepository] для зависимости: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат autowire для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (required = 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(){
...
}
}