Mysql Spring测试DBUnit:即使在最简单的测试中,表比较也失败

Mysql Spring测试DBUnit:即使在最简单的测试中,表比较也失败,mysql,dbunit,spring-test,Mysql,Dbunit,Spring Test,我使用SpringTestDBUnit来测试我的DB服务和Hibernate。 我写了一个最简单的测试: @Test @DatabaseSetup("dumbDataSample_DBAccount.xml") @DatabaseTearDown("dumbDataSample_DBAccount.xml") @ExpectedDatabase(assertionMode=DatabaseAssertionMode.NON_STRICT, value ="dumbData

我使用SpringTestDBUnit来测试我的DB服务和Hibernate。 我写了一个最简单的测试:

@Test
    @DatabaseSetup("dumbDataSample_DBAccount.xml")
    @DatabaseTearDown("dumbDataSample_DBAccount.xml")
    @ExpectedDatabase(assertionMode=DatabaseAssertionMode.NON_STRICT, value ="dumbDataSample_DBAccount.xml")
    public void testBasic() {
    }
它失败了!为什么?在我修改表(删除了一些字段,添加了其他字段,重新分配了主键)之前,它确实起了作用。DBunit似乎比较了不同记录中的companyName列 dumbDataSample_DBAccount.xml

    <?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <adminaccounts username="naruto" forcePassChange="true" companyName="Konoha" email="naruto@konoha.jp"/>
    <adminaccounts username="sephiroth" forcePassChange="false" companyName="Shinra" email="sephi@shinra.com"/>
    <adminaccounts username="geralt" forcePassChange="false" companyName="no"/>
</dataset>
这是我的实体类:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="adminaccounts")
public class DBAccount implements Serializable {
    private static final long serialVersionUID = 1L;
    /** Account name */
    @Id
    @Column(name="username")
    private String username;
    public void setUsername(String n)
    {
        this.username = n;
    }
    public String getUsername()
    {
        return this.username;
    }
    /** Force password change flag */
    @Column(name="forcePassChange")
    private boolean forceChange;
    public void setForceChange(boolean f)
    {
        this.forceChange = f;
    }
    public boolean getForceChange()
    {
        return this.forceChange;
    }
    /**  Company name */
    @Column(name="companyName")
    private String company;
    public void setCompany(String c)
    {
        this.company = c;
    }
    public String getCompany()
    {
        return this.company;
    }
    /** email */
    @Column(name="email")
    private String email;
    public void setEmail(String e)
    {
        this.email = e;
    }
    public String getEmail()
    {
        return this.email;
    }

    public String toString()
    {
        String s = this.username + " " + this.company + " " + this.email + " " + (this.forceChange ? "Force" : "No force");
        return s;
    }

}
休眠配置:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <mapping class="jp.co.rns.model.DBAccount" />
    </session-factory>

</hibernate-configuration>

我使用注释,因此没有persistence.xml文件

下面是测试上下文

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.1.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />    
    <!-- ===============Properties files================== -->
 <util:properties id="appProperties" 
    location="classpath:application.properties">
    </util:properties>
 <beans:bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
     p:location="classpath:jdbc.properties" />
<!-- ================================================= -->

     <beans:bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="configLocation">
            <beans:value>classpath:hibernate.cfg.xml</beans:value>
        </beans:property>
        <beans:property name="configurationClass">
            <beans:value>org.hibernate.cfg.AnnotationConfiguration</beans:value>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">${jdbc.dialect}</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>

    <tx:annotation-driven />
    <beans:bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="sessionFactory" />
    </beans:bean>

       <!--   p:driverClassName="${jdbc.driverClassName}"-->
    <beans:bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" >
        <beans:property name="driverClassName">
        <beans:value>${jdbc.driverClassName}</beans:value>
        </beans:property>
        </beans:bean>
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    <context:component-scan base-package="jp.co.rns" />

    <mvc:interceptors>
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <beans:property name="paramName" value="lang" />
    </beans:bean>
    <beans:bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
        <beans:property name="paramName" value="lang" />
    </beans:bean>
    </mvc:interceptors>

    <beans:bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basename" value="classpath:static" />
    <beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>

<beans:bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <beans:property name="paramName" value="lang" />
</beans:bean>

<beans:bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <beans:property name="defaultLocale" value="en"/>
</beans:bean> 

<!-- For Themes -->
<beans:bean id="themeSource"
    class="org.springframework.ui.context.support.ResourceBundleThemeSource">
        <beans:property name="basenamePrefix" value="theme_" />
</beans:bean>

<!-- Theme Change Interceptor and Resolver definition -->
<beans:bean id="themeChangeInterceptor"
    class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
    <beans:property name="paramName" value="lang" />     
</beans:bean>
<beans:bean id="themeResolver"
    class="org.springframework.web.servlet.theme.CookieThemeResolver">
    <beans:property name="defaultThemeName" value="en" />    
</beans:bean>
<beans:bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <beans:property name="interceptors">
    <beans:list>            
        <beans:ref bean="themeChangeInterceptor" />
        <beans:ref bean="localeChangeInterceptor" />
    </beans:list>
    </beans:property>
</beans:bean>
</beans:beans>

类路径:hibernate.cfg.xml
org.hibernate.cfg.AnnotationConfiguration
${jdbc.dial}
真的
${jdbc.driverClassName}
我找到了原因:

@Id
@Column(name="username")
private String username;
主键必须是自动生成的int,而不是string

我重组了我的桌子;DBUnit现在可以工作了

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-3.1.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />    
    <!-- ===============Properties files================== -->
 <util:properties id="appProperties" 
    location="classpath:application.properties">
    </util:properties>
 <beans:bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
     p:location="classpath:jdbc.properties" />
<!-- ================================================= -->

     <beans:bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="configLocation">
            <beans:value>classpath:hibernate.cfg.xml</beans:value>
        </beans:property>
        <beans:property name="configurationClass">
            <beans:value>org.hibernate.cfg.AnnotationConfiguration</beans:value>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">${jdbc.dialect}</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>

    <tx:annotation-driven />
    <beans:bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="sessionFactory" />
    </beans:bean>

       <!--   p:driverClassName="${jdbc.driverClassName}"-->
    <beans:bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" >
        <beans:property name="driverClassName">
        <beans:value>${jdbc.driverClassName}</beans:value>
        </beans:property>
        </beans:bean>
    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    <context:component-scan base-package="jp.co.rns" />

    <mvc:interceptors>
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <beans:property name="paramName" value="lang" />
    </beans:bean>
    <beans:bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
        <beans:property name="paramName" value="lang" />
    </beans:bean>
    </mvc:interceptors>

    <beans:bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basename" value="classpath:static" />
    <beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>

<beans:bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <beans:property name="paramName" value="lang" />
</beans:bean>

<beans:bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <beans:property name="defaultLocale" value="en"/>
</beans:bean> 

<!-- For Themes -->
<beans:bean id="themeSource"
    class="org.springframework.ui.context.support.ResourceBundleThemeSource">
        <beans:property name="basenamePrefix" value="theme_" />
</beans:bean>

<!-- Theme Change Interceptor and Resolver definition -->
<beans:bean id="themeChangeInterceptor"
    class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
    <beans:property name="paramName" value="lang" />     
</beans:bean>
<beans:bean id="themeResolver"
    class="org.springframework.web.servlet.theme.CookieThemeResolver">
    <beans:property name="defaultThemeName" value="en" />    
</beans:bean>
<beans:bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <beans:property name="interceptors">
    <beans:list>            
        <beans:ref bean="themeChangeInterceptor" />
        <beans:ref bean="localeChangeInterceptor" />
    </beans:list>
    </beans:property>
</beans:bean>
</beans:beans>
@Id
@Column(name="username")
private String username;