Squeak.ru - шаблоны программирования

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

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

Контроллер (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(){
  ... 
   }
}

Ответы:


1

используйте @SpringBootTest и @RunWith (SpringRunner.class) для загрузки контекста

@RunWith(SpringRunner.class)
@SpringBootTest
class Demo{
    @Test
    void contextLoad(){}
}
04.02.2021

2

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

29.10.2013
  • Хорошо, я думаю, что понимаю. Но репозитории - это интерфейсы, как я могу создать их экземпляры, такие как SessionService ?! 29.10.2013
  • Вы сказали, что у приложения есть структура Controller (REST) ​​- ›Services -› Repositories. Это означает, что репозитории - это классы, которые обращаются к базе данных (DAO). Итак, если SessionRepository - это интерфейс, вы должны иметь его реализацию в своем приложении. В другом случае, когда вы запустите свой проект, Spring получит такое же исключение, потому что не найдет ни одного класса, реализующего указанный интерфейс. 29.10.2013
  • Загрузка использует Spring-Data-JPA (projects.spring.io/spring-data-jpa), где вы определяете только интерфейс, а Spring каким-то образом автоматически предоставляет реализацию. В своих Сервисах я просто @Autowire их, но не знаю, как это должно работать с тестированием. 29.10.2013
  • Хорошо, я понял, что вам нужно. Сначала попробуйте запустить тест в контексте приложения JpaConfig. Вам следует попробовать использовать эту аннотацию в текстовом классе @ContextConfiguration (classes = {JpaConfig.class}) 29.10.2013
  • mh получил это, но не меняет исключения. 29.10.2013
  • Это должно работать @ContextConfiguration (classes = JpaConfig.class, loader = AnnotationConfigContextLoader.class). Вы можете увидеть примеры здесь spring.io/blog/2011/06/21/ 29.10.2013
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...