Запрос на обновление jdbc не работает в модульном тесте с базой данных derby и SpringJUnit4ClassRunner
У меня проблемы с попыткой сделать юнит-тест.
Тестовый класс прост как:
@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>
Сначала я думал, что проблема связана с проблемами фиксации, но я попытался установить значение свойства autocommit на "true", а также вручную вызвать testDataSource.getConnection().commit()
но это не сработало. Код и методы работают нормально, но тест не обновляет базу данных derby. В других тестовых классах данные предустановлены с dbUnit
в той же базе и код работает. Этот ответ здесь дает общий список возможных проблем, которые я проверял, и я читаю и пишу в те же таблицы в тех же схемах. Я что-то пропустил?
2 ответа
В качестве ответа на вопрос, который я разместил, я проверил автокоммит и, если я писал в нужную базу данных, но не проверил очевидное: вы не можете обновить таблицу без регистров! Запрос UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?
был применен к пустой таблице, и запрос подсчета всегда возвращал 0. Я просто настроил тест, чтобы DbUnit импортировал состояние в базу данных из XML-файла. Извините за беспокойство.