Note that there are some explanatory texts on larger screens.

plurals
  1. POSpring test DBUnit : table comparison fails even in simplest test
    primarykey
    data
    text
    <p>I use Spring test DBUnit to test my DB Service and Hibernate. I wrote a simplest test possible:</p> <pre><code>@Test @DatabaseSetup("dumbDataSample_DBAccount.xml") @DatabaseTearDown("dumbDataSample_DBAccount.xml") @ExpectedDatabase(assertionMode=DatabaseAssertionMode.NON_STRICT, value ="dumbDataSample_DBAccount.xml") public void testBasic() { } </code></pre> <p>And it fails! Why? It did work before I modified the table (removed some fields, added other, reassigned primary key ) It seem that DBunit compares companyName columns from different records dumbDataSample_DBAccount.xml</p> <pre><code> &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;dataset&gt; &lt;adminaccounts username="naruto" forcePassChange="true" companyName="Konoha" email="naruto@konoha.jp"/&gt; &lt;adminaccounts username="sephiroth" forcePassChange="false" companyName="Shinra" email="sephi@shinra.com"/&gt; &lt;adminaccounts username="geralt" forcePassChange="false" companyName="no"/&gt; &lt;/dataset&gt; </code></pre> <p>Any ideas? Here is the trace</p> <pre><code>junit.framework.ComparisonFailure: value (table=adminaccounts, row=0, col=companyName) expected:&lt;[Konoha]&gt; but was:&lt;[no]&gt; at org.dbunit.assertion.JUnitFailureFactory.createFailure(JUnitFailureFactory.java:39) at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:105) at org.dbunit.assertion.DefaultFailureHandler.handle(DefaultFailureHandler.java:208) at org.dbunit.assertion.DbUnitAssert.compareData(DbUnitAssert.java:524) at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:409) at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:312) at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:274) at org.dbunit.assertion.DbUnitAssert.assertEqualsIgnoreCols(DbUnitAssert.java:122) at org.dbunit.Assertion.assertEqualsIgnoreCols(Assertion.java:74) at com.github.springtestdbunit.assertion.NonStrictDatabaseAssertion.assertEquals(NonStrictDatabaseAssertion.java:44) at com.github.springtestdbunit.DbUnitRunner.verifyExpected(DbUnitRunner.java:128) at com.github.springtestdbunit.DbUnitRunner.afterTestMethod(DbUnitRunner.java:80) at com.github.springtestdbunit.DbUnitTestExecutionListener.afterTestMethod(DbUnitTestExecutionListener.java:141) at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:406) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:91) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) </code></pre> <p>Here is the table's script:</p> <pre><code>CREATE TABLE `adminaccounts` ( `username` varchar(50) NOT NULL, `companyName` varchar(50) NOT NULL DEFAULT 'Unknown', `email` varchar(50) DEFAULT NULL, `forcePassChange` bit(1) NOT NULL DEFAULT b'1', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 </code></pre> <p>Here is my Entity class:</p> <pre><code>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; } } </code></pre> <p>hibernate config:</p> <pre><code>&lt;?xml version='1.0' encoding='utf-8'?&gt; &lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt; &lt;hibernate-configuration&gt; &lt;session-factory&gt; &lt;mapping class="jp.co.rns.model.DBAccount" /&gt; &lt;/session-factory&gt; &lt;/hibernate-configuration&gt; </code></pre> <p>I use annotations so no persistence.xml file</p> <p>Here is test context</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;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"&gt; &lt;!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --&gt; &lt;!-- Enables the Spring MVC @Controller programming model --&gt; &lt;annotation-driven /&gt; &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt; &lt;resources mapping="/resources/**" location="/resources/" /&gt; &lt;!-- ===============Properties files================== --&gt; &lt;util:properties id="appProperties" location="classpath:application.properties"&gt; &lt;/util:properties&gt; &lt;beans:bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="classpath:jdbc.properties" /&gt; &lt;!-- ================================================= --&gt; &lt;beans:bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;beans:property name="dataSource" ref="dataSource" /&gt; &lt;beans:property name="configLocation"&gt; &lt;beans:value&gt;classpath:hibernate.cfg.xml&lt;/beans:value&gt; &lt;/beans:property&gt; &lt;beans:property name="configurationClass"&gt; &lt;beans:value&gt;org.hibernate.cfg.AnnotationConfiguration&lt;/beans:value&gt; &lt;/beans:property&gt; &lt;beans:property name="hibernateProperties"&gt; &lt;beans:props&gt; &lt;beans:prop key="hibernate.dialect"&gt;${jdbc.dialect}&lt;/beans:prop&gt; &lt;beans:prop key="hibernate.show_sql"&gt;true&lt;/beans:prop&gt; &lt;/beans:props&gt; &lt;/beans:property&gt; &lt;/beans:bean&gt; &lt;tx:annotation-driven /&gt; &lt;beans:bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;beans:property name="sessionFactory" ref="sessionFactory" /&gt; &lt;/beans:bean&gt; &lt;!-- p:driverClassName="${jdbc.driverClassName}"--&gt; &lt;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}" &gt; &lt;beans:property name="driverClassName"&gt; &lt;beans:value&gt;${jdbc.driverClassName}&lt;/beans:value&gt; &lt;/beans:property&gt; &lt;/beans:bean&gt; &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt; &lt;beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;beans:property name="prefix" value="/WEB-INF/views/" /&gt; &lt;beans:property name="suffix" value=".jsp" /&gt; &lt;/beans:bean&gt; &lt;context:component-scan base-package="jp.co.rns" /&gt; &lt;mvc:interceptors&gt; &lt;beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&gt; &lt;beans:property name="paramName" value="lang" /&gt; &lt;/beans:bean&gt; &lt;beans:bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"&gt; &lt;beans:property name="paramName" value="lang" /&gt; &lt;/beans:bean&gt; &lt;/mvc:interceptors&gt; &lt;beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"&gt; &lt;beans:property name="basename" value="classpath:static" /&gt; &lt;beans:property name="defaultEncoding" value="UTF-8"/&gt; &lt;/beans:bean&gt; &lt;beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&gt; &lt;beans:property name="paramName" value="lang" /&gt; &lt;/beans:bean&gt; &lt;beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"&gt; &lt;beans:property name="defaultLocale" value="en"/&gt; &lt;/beans:bean&gt; &lt;!-- For Themes --&gt; &lt;beans:bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource"&gt; &lt;beans:property name="basenamePrefix" value="theme_" /&gt; &lt;/beans:bean&gt; &lt;!-- Theme Change Interceptor and Resolver definition --&gt; &lt;beans:bean id="themeChangeInterceptor" class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"&gt; &lt;beans:property name="paramName" value="lang" /&gt; &lt;/beans:bean&gt; &lt;beans:bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver"&gt; &lt;beans:property name="defaultThemeName" value="en" /&gt; &lt;/beans:bean&gt; &lt;beans:bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&gt; &lt;beans:property name="interceptors"&gt; &lt;beans:list&gt; &lt;beans:ref bean="themeChangeInterceptor" /&gt; &lt;beans:ref bean="localeChangeInterceptor" /&gt; &lt;/beans:list&gt; &lt;/beans:property&gt; &lt;/beans:bean&gt; &lt;/beans:beans&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload