jdbc 更新查询无法使用 derby 数据库和 SpringJUnit4ClassRunner 进行单元测试
jdbc update query no working on unit test with derby database and SpringJUnit4ClassRunner
我在尝试进行单元测试时遇到问题。
测试 class 很简单,如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/job-runner-context.xml})
public class AtualizarDataServiceTest {
@Autowired
DataSource testDataSource;
@Autowired
Service service;
@Before
public void setUp() throws DatabaseUnitException, SQLException{
service.setDataSource(testDataSource);
}
@Test
public final void testUpdateDate() throws SQLException {
assertTrue(verifyDate());
service.updateDate();
assertFalse(verifyDate()); //Assert brokes here
}
private boolean verifyDate(){
SimpleJdbcTemplate consultaTemplate = new SimpleJdbcTemplate(testDataSource);
int count = consultaTemplate.queryForInt("SELECT COUNT(*) FROM MY_TABLE");
return count == 0;
}
}
服务:
public class Service {
private DataSource dataSource;
public void updateDate(){
SimpleJdbcTemplate jdbcTemplate = new SimpleJdbcTemplate(getDataSource());
String query = "UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?";
jdbcTemplate.update(query, new Object[]{new java.sql.Date(Calendar.getInstance().getTime().getTime())});
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
job-runner-context.xml
重要篇章:
<context:annotation-config/>
<context:component-scan base-package="my.package"/>
<bean class="my.package.Service"/>
<bean id="testDataSource" class="com.read.only.MyBasicDataSource" destroy-method="close" lazy-init="true">
<property name="jdbcReference" value="derby" />
</bean>
jdbc 连接属性:
<com:jdbcReference name="derby" type="DATABASE">
<com:credential user="" password="" />
<com:autocommit arg="false" />
<com:databaseConfig driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:dbderby;create=true" databaseName="ANY" />
</com:jdbcReference>
起初我认为问题与提交问题有关,但我尝试将自动提交属性的值设置为 "true" 并手动调用 testDataSource.getConnection().commit()
但它没有用。代码和方法运行良好,但测试未更新 derby 数据库。在其他测试中,classes 数据在同一数据库中使用 dbUnit
预设,并且代码有效。这个答案 here 给出了我检查过的可能问题的一般列表,我正在读取和写入相同模式中的相同表。我错过了什么吗?
尝试设置 <com:autocommit arg="true" />
。
作为我发布的问题的 answer,我验证了自动提交,如果我正在写入正确的数据库,但没有检查明显的:你不能更新table 没有寄存器! 查询 UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?
应用于空 table 并且计数查询始终 return 0。我刚刚将测试配置为使 DbUnit 从 xml 文件将状态导入数据库。抱歉给您带来麻烦。
我在尝试进行单元测试时遇到问题。
测试 class 很简单,如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/job-runner-context.xml})
public class AtualizarDataServiceTest {
@Autowired
DataSource testDataSource;
@Autowired
Service service;
@Before
public void setUp() throws DatabaseUnitException, SQLException{
service.setDataSource(testDataSource);
}
@Test
public final void testUpdateDate() throws SQLException {
assertTrue(verifyDate());
service.updateDate();
assertFalse(verifyDate()); //Assert brokes here
}
private boolean verifyDate(){
SimpleJdbcTemplate consultaTemplate = new SimpleJdbcTemplate(testDataSource);
int count = consultaTemplate.queryForInt("SELECT COUNT(*) FROM MY_TABLE");
return count == 0;
}
}
服务:
public class Service {
private DataSource dataSource;
public void updateDate(){
SimpleJdbcTemplate jdbcTemplate = new SimpleJdbcTemplate(getDataSource());
String query = "UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?";
jdbcTemplate.update(query, new Object[]{new java.sql.Date(Calendar.getInstance().getTime().getTime())});
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
job-runner-context.xml
重要篇章:
<context:annotation-config/>
<context:component-scan base-package="my.package"/>
<bean class="my.package.Service"/>
<bean id="testDataSource" class="com.read.only.MyBasicDataSource" destroy-method="close" lazy-init="true">
<property name="jdbcReference" value="derby" />
</bean>
jdbc 连接属性:
<com:jdbcReference name="derby" type="DATABASE">
<com:credential user="" password="" />
<com:autocommit arg="false" />
<com:databaseConfig driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:dbderby;create=true" databaseName="ANY" />
</com:jdbcReference>
起初我认为问题与提交问题有关,但我尝试将自动提交属性的值设置为 "true" 并手动调用 testDataSource.getConnection().commit()
但它没有用。代码和方法运行良好,但测试未更新 derby 数据库。在其他测试中,classes 数据在同一数据库中使用 dbUnit
预设,并且代码有效。这个答案 here 给出了我检查过的可能问题的一般列表,我正在读取和写入相同模式中的相同表。我错过了什么吗?
尝试设置 <com:autocommit arg="true" />
。
作为我发布的问题的 answer,我验证了自动提交,如果我正在写入正确的数据库,但没有检查明显的:你不能更新table 没有寄存器! 查询 UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?
应用于空 table 并且计数查询始终 return 0。我刚刚将测试配置为使 DbUnit 从 xml 文件将状态导入数据库。抱歉给您带来麻烦。