Nano Hash - криптовалюты, майнинг, программирование

CDI в тестах JUnit с помощью Jersey Test Framework

Мы используем тестовые платформы Джерси для тестирования API. В тестовом режиме мы используем базу данных h2, а в продакшене - mysql. Пока все в порядке.

Теперь я хочу написать тесты для наших репозиториев, чтобы проверить, правильно ли записываются данные в базу данных.

Я не могу вводить какие-либо классы в свои тесты, поэтому я использую стандартный конструктор для создания нового экземпляра RepositoryA. Работает для меня.

Теперь проблема: RepositoryA теперь внедряет экземпляр RepositoryB. И инъекция не работает в тестовой области.

Можно ли запустить инъекцию в этой среде?


Ответы:


1

В зависимости от версий используемых вами библиотек выполнение CDI в JUnit Test отличается.

Для начала нужно добавить эту зависимость, выбрав нужную версию:

<dependency>
   <groupId>org.jboss.weld</groupId>
   <artifactId>weld-junit5</artifactId> // or weld-junit4
   <version>1.3.0.Final</version>
   <scope>test</scope>
</dependency>

Затем вы можете включить Weld в своем тесте JUnit. Вот пример внедрения репозитория для класса сущности VideoGame:

@Slf4j
@EnableWeld
class VideoGameRepositoryTest
{
    @WeldSetup 
    private WeldInitiator weld = WeldInitiator.performDefaultDiscovery();

    @Inject
    private VideoGameRepository repo;

    @Test
    void test()
    {
        VideoGame videoGame = VideoGameFactory.newInstance();
        videoGame.setName("XENON");
        repo.save(videoGame);
        // testing if the ID field had been generated by the JPA Provider.
        Assert.assertNotNull(videoGame.getVersion());
        Assert.assertTrue(videoGame.getVersion() > 0);
       log.info("Video Game : {}", videoGame);
    }
 }

Важные части:

  • @EnableWeld помещен в тестовый класс JUnit.
  • @WeldSetup помещается в поле WeldInitiator для поиска всех аннотированных классов.
  • не забудьте beans.xml в META-INF пути к тестовым классам, чтобы настроить discovery-mode.
  • @Slf4j - это аннотация ломбока, она вам не нужна (если вы уже не используете Ломбок)

Здесь экземпляр VideoGameRepository также получает выгоду от внедрения, как и в классическом проекте CDI.

Вот код VideoGameFactory, который получает новый экземпляр класса сущности, помеченный областью @Dependent. Эта фабрика программно вызывает текущий контекст CDI.

public class VideoGameFactory
{
    public static VideoGame newInstance()
    {
        // ask CDI for the instance, injecting required dependencies.
        return CDI.current().select(VideoGame.class).get();
    }
}

В качестве альтернативы вы можете взглянуть на Arquillian, который может поставляться с полным сервером Java EE, чтобы иметь все необходимые зависимости.

30.07.2018
  • Здорово, танк тебе. Могу ли я использовать EntityManagerFactory и т. Д. Со сварным швом? 08.08.2018
  • Да, и создайте Producer, чтобы внедрить EntityManager 08.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..