【问题标题】:JUnit Testing (with Spring MVC and Hibernate): IllegalArgumentException: Unknown entityJUnit 测试(使用 Spring MVC 和 Hibernate):IllegalArgumentException:未知实体
【发布时间】:2026-02-09 19:05:01
【问题描述】:

我正在尝试做一些 JUnit 持久性测试。我正在使用 Spring MVC 和 Hibernate。

我的 TestConfig 文件如下所示:

@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("src.main.java.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);
     }
}

这是我要运行的测试。

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

    private static final long USERID = 1;
    private static final long NONEXISTENTUSERID = -1;
    private static final String FIRSTNAME = "TestFirstName";
    private static final String LASTNAME = "TestLastName";
    private static final String EMAIL = "test1@mail.com";
    private static final String PASSWORD = "TestPassword";
    private static final String PHONENUMBER = "0000000";
    private static final String ROLE = "USER";

    @PersistenceContext
    private EntityManager em;

    @Autowired 
    private UserHibernateDao userHibernateDao;  
    private JdbcTemplate jdbcTemplate;

    @Before
    @Transactional
    public void setUp() {
        this.userHibernateDao = new UserHibernateDao();
            User u;
            u = new User();
            u.setUserid(123);
            u.setFirstName(FIRSTNAME);
            u.setLastName(LASTNAME);
            u.setEmail(EMAIL);
            u.setPassword(PASSWORD);
            u.setPhoneNumber(PHONENUMBER);
            u.setRole(ROLE);
            em.persist(u);

    }

    @Rollback
    @Test
    public void testCreate() {
    //  just trying to run this empty test
    }
}

问题是我什至无法运行那个简单的空测试,因为我遇到了几个异常,最后一个是:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ar.edu.itba.paw.persistence.UserHibernateDao] 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)}

关于如何解决这个问题的任何想法?

【问题讨论】:

  • Spring 不知道应该将什么注入到 UserHibernateDao userHibernateDao 的 bean。

标签: java hibernate spring-mvc junit javabeans


【解决方案1】:

在进行测试时,您必须提供完整的 spring 配置才能实例化您的测试类。

在您的情况下,您有一个用于 UserHibernateDao 类属性的自动装配,但请注意目前为 spring 提供了一种装配此类的方法。当您在 setup 方法中直接实例化 UserHibernateDao 时。只需删除自动接线即可解决您的问题。

【讨论】:

  • 感谢您修复了异常。现在我遇到了另一个问题,我刚刚更新了问题。
  • 你可以看看这个问题的新部分:*.com/questions/19333955/…
  • 通过查看它只是说我必须在我的测试类中添加@Rollback 还是我弄错了?
  • 嗯,这与这个问题不同,但如果你不想回滚,那就是@Rollback(false)。
  • 好的,我要为此提出另一个问题,因为我遇到了一些问题。不过谢谢