【问题标题】:JUnit Test: NoSuchBeanDefinitionException: No qualifying bean of typeJUnit 测试:NoSuchBeanDefinitionException:没有符合条件的 bean 类型
【发布时间】:2020-01-18 22:08:35
【问题描述】:

我收到以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.servlet.http.HttpServletRequest] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
... 56 more

完整的堆栈跟踪here

这是我的 JUnit:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@Transactional
public class Prueba {

    private static final String FIRSTNAME = "TestFirstName";
    private static final String LASTNAME = "TestLastName";
    private static final String EMAIL = "test@mail.com";
    private static final String PASSWORD = "TestPassword";
    private static final String PHONENUMBER = "00000000";
    private static final String ROLE = "USER";

    @PersistenceContext
    private EntityManager em;

    @Autowired
    private UserHibernateDao userDao; // THIS SEEMS TO BE THE ISSUE!
    private JdbcTemplate jdbcTemplate;
    private long user_id;

    @Before
    @Transactional
    public void setUp() {

        User u;
        for (int i = 0; i < 50; i++) {
            u = new User();
            u.setFirstName(i + FIRSTNAME + i);
            u.setLastName(i + LASTNAME + i);
            u.setEmail(i + EMAIL);
            u.setLocked(false);
            em.persist(u);
            if (i == 10) {
                this.user_id = u.getUserid();
            }

        }
    }

    @Rollback
    @Test
    public void testCreate() {
        final User user =  userDao.create(FIRSTNAME, LASTNAME, EMAIL, PASSWORD, PHONENUMBER, ROLE);
        assertNotNull(user);
    }
}

我在代码中指出的问题似乎是当我自动装配 UserHibernateDao 时。

这是我的测试配置:

@ComponentScan({"src.main.java.ar.edu.itba.paw.persistence",   })
@Configuration
public class TestConfig {

    @Bean
    public DataSource dataSource() {
        final SimpleDriverDataSource ds = new SimpleDriverDataSource();
        ds.setDriverClass(JDBCDriver.class);
        ds.setUrl("jdbc:hsqldb:mem:paw");
        ds.setUsername("ha");
        ds.setPassword("");
        return ds;
    }

     @Bean
     public LocalContainerEntityManagerFactoryBean getEntityManagerFactory() {
         final LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
         factoryBean.setPackagesToScan("ar.edu.itba.paw.models");
         factoryBean.setDataSource(dataSource());
         final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
         factoryBean.setJpaVendorAdapter(vendorAdapter);
         final Properties properties = new Properties();
         properties.setProperty("hibernate.hbm2ddl.auto", "update");
         properties.setProperty("hibernate.search.default.directory_provider", "filesystem");
         properties.setProperty("hibernate.search.default.indexBase", "lucene/indexes");
         properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
         properties.setProperty("hibernate.show_sql", "true");
         properties.setProperty("format_sql", "true");
         factoryBean.setJpaProperties(properties);
         return factoryBean;
       }



     @Bean
     public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
          return new JpaTransactionManager(emf);
     }

     @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
}

这是我的包裹的外观:

关于如何解决它的任何想法?

我试着改变我的 @ComponentScan({"src.main.java.ar.edu.itba.paw.persistence", })

到 @ComponentScan({"ar.edu.itba.paw.persistence", })

但这也不起作用。

这也是我的UserHibernateDao class

【问题讨论】:

  • 请分享完整的错误堆栈。 org.springframework.beans.factory.UnsatisfiedDependencyException 部分将显示失败的确切组件。它与您共享的课程无关
  • @R.G 好的,我刚刚在这里发布了它pastebin.com/ZHAEQnLz
  • 1. @ComponentScan() 在开头似乎有一个额外的反斜杠。 2. 请分享 UserHibernateDao 类。这个类是如何做成 bean 的?
  • 那个反斜杠是错字对不起。这是 UserHIbernateDao pastebin.com/eBRG3AvX
  • 您将 HttpServletRequest 连接到存储库,这是不推荐的方式。为了让这个测试工作,你需要模拟 HttpServletRequest

标签: spring hibernate spring-mvc junit javabeans


【解决方案1】:

您尝试@Autowired 的类应该使用@Service 或@Component 进行注释

【讨论】:

    【解决方案2】:

    由于 em.persist,问题显然是在设置过程中出现的。我把它改成:

    @Before
    @Transactional
    public void setUp() {
    
        User u;
        for (int i = 10; i < 50; i++) {
            u = new User(i+FIRSTNAME, i+LASTNAME, i+EMAIL, PASSWORD, PHONENUMBER, ROLE, LANGUAGE);
            em.merge(u);
            if (i == 10) {
                this.user_id = u.getUserid();
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2017-11-27
      • 2020-06-18
      • 2020-06-10
      • 1970-01-01
      相关资源
      最近更新 更多