JPA实体在单元测试期间未扫描

时间:2013-05-16 19:24:52

标签: java spring hibernate jpa junit

我有一个使用Hibernate / JPA的成熟java应用程序,它运行得很好。我们正在尝试添加一些单元/集成测试。我使用Spring的TestContext框架,我的测试类是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ServiceTest {

    @Autowired
    private MyService myService;

    @Test
    public void testWorkspaceThing() throws Exception {

        List<MyEntity> entities = myService.someMethod();
        assertNotNull(entities);
    }
}

我将所有必要的上下文配置从应用程序上下文复制/粘贴到ServiceTest-context.xml中。这包括上下文:组件扫描,定义dataSource,entityManagerFactory bean等。当应用程序运行时,我没有错误。运行此测试时,我得到:

java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: MyEntity is not mapped.

对于我尝试查询的任何和所有实体类。 Entity类使用javax.persistence.Entity等进行注释。

有谁知道为什么使用TestContext会失败?

更新

我们的persistence.xml文件基本上是空的:

<persistence-unit name="some-pu" />

所以我假设它是自动扫描找到所有带注释的实体类。在运行单元测试时,它在tomcat中的部署方式与文件夹结构之间的目录结构有何不同?我们的persistence.xml位于WebContent / WEB-INF / classes / META-INF

另外 - 我注意到您可以使用Spring 3.1定义“packagesToScan”,但我们使用的是Spring 3.0.6.RELEASE

3 个答案:

答案 0 :(得分:3)

此消息通常表示您未在hibernate.cfg或persistence.xml中映射您的实体

<mapping class="com.yourpackage.MyEntity" />
...other entities

确保MyEntity类在那里映射,并且类中的注释正好是@Entity(name="MyEntity")

编辑:如果您使用上面的Spring 3.1,请尝试使用以下命令在您的测试环境中指示EntityManager工厂bean:

  <property name="packagesToScan">
     <list>
        <value>com.yourpackage.domain</value>
     </list>
  </property>

答案 1 :(得分:2)

我通过ant运行junit测试来实现它。我将persistence.xml文件复制到build / classes / META-INF,以便它与编译的实体类位于同一文件夹树中,这样就可以使扫描工作并使测试正常运行。

如果我删除了persistence.xml的Webcontent / WEB-INF / classes / META-INF副本并将其保留在build /文件夹中,则这在Eclipse中有效。我想知道是否有更好的方法让它在Eclipse中运行。

答案 2 :(得分:0)

尝试将此添加到persistence.xml文件中。

<persistence-unit name="some-pu" transaction-type="RESOURCE_LOCAL">
<class>package.MyEntity</class>

        <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.username" value="USER-DB"/>
        <property name="hibernate.connection.password" value="PASSWORD-DB"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://SERVER-IP/some-pu?autoReconnect=true"/>
        <property name="hibernate.max_fetch_depth" value="3"/>

         <!-- Determines how many connections at a time c3p0 will try to acquire when the pool is exhausted. :: default=1 -->
        <property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
        <property name="hibernate.c3p0.min_size" value="2"/>
        <property name="hibernate.c3p0.timeout" value="300"/>
        <property name="hibernate.c3p0.idle_test_period" value="300"/>
        <property name="hibernate.c3p0.acquire_increment" value="1"/> 
        <property name="hibernate.c3p0.max_size" value="10"/> 
        <property name="hibernate.c3p0.max_statements" value="50"/>     

    </properties>
</persistence-unit>

我希望它能帮到你