Как использовать Dependency Injection в тесте с Junit5 и Spring5 - PullRequest
0 голосов
/ 27 апреля 2019

Я хотел бы начать использовать интеграционный тест в своем MVC WebApp, но я не могу использовать внедрение зависимостей для слоя Dao.

Мое веб-приложение настроено с использованием только классов Java для конфигурации (100% -ная конфигурация на основе Java). Это три класса, используемые для настройки и запуска приложения:

  • HibernateJpaConfig (для конфигурации постоянства, очевидно)

    @Configuration
    @EnableTransactionManagement
    @PropertySource({ "classpath:persistence-mysql.properties" }) 
    @ComponentScan({"it.perk.service"}) 
    @ComponentScan({"it.perk.model.dao"})  
    public class HibernateJpaConfig { 
    }   
    
  • SpringWebConfig (для конфигурации WebMVC)

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "it.perk.fenix.controller")
    @ComponentScan(basePackages = "it.perk.fenix.provider")
    public class SpringWebConfig {
    }
    
  • WebAppInitializer (для настройки ServletContext)

    public class WebAppInitializer implements WebApplicationInitializer {
    
     @Override
     public void onStartup(ServletContext container) throws ServletException {
      ....
     }
    }
    

Теперь, если я пытаюсь протестировать создание контекста моего приложения, у меня нет проблем, Test is OK:

@SpringJUnitConfig(HibernateJpaConfig.class)
public class UtenteDaoTest {

    @Autowired
    private ApplicationContext appContext;

    //@Autowired
    //public IUtenteDAO utenteDao;

    @Test
    void givenAppContext_WhenInjected_ThenItShouldNotBeNull() {
         Assertions.assertNotNull(appContext);
    }

Но если я раскомментирую только инъекцию класса Дао, исключение будет таким:

04:21:05.732 ERROR TestContextManager - Caught exception while allowing TestExecutionListener   [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@2e4b8173] to prepare test instance [it.perk.fenix.test.model.dao.impl.UtenteDaoTest@78d6447a]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'it.perk.fenix.test.model.dao.impl.UtenteDaoTest': Unsatisfied dependency expressed through field 'utenteDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'it.perk.fenix.model.dao.IUtenteDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Перед написанием я исследовал возможную проблему, и кажется, что я не могу повторно использовать способ создания ServletContext для моих целей тестирования source .

Я принял это, но не могу найти способ достичь своей цели, поэтому я спрашиваю, попал ли кто-нибудь в мой же случай и нашел ли он стандартное решение для тестирования слоев Dao и Service с помощью Depency Injection (@Autowired) .

спасибо Я доступен для более подробной информации

...