Java Spring单元测试未从数据库获取更新的值
我使用普通SpringJDBC和dao进行了简单的spring配置。 我已经为dao层添加了一个测试用例,它实现了以下功能。 -获取设置 -测试记录的数量和值 -使用新值更新设置 -测试更新的值 我无法使用更新的断言值,下面是我得到的错误。不知道怎么了Java Spring单元测试未从数据库获取更新的值,java,spring,jdbc,junit,spring-jdbc,Java,Spring,Jdbc,Junit,Spring Jdbc,我使用普通SpringJDBC和dao进行了简单的spring配置。 我已经为dao层添加了一个测试用例,它实现了以下功能。 -获取设置 -测试记录的数量和值 -使用新值更新设置 -测试更新的值 我无法使用更新的断言值,下面是我得到的错误。不知道怎么了 Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.386 sec <<< FAILURE! updateTest(com.sims.service
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.386 sec <<< FAILURE!
updateTest(com.sims.service.SettingsServiceTests) Time elapsed: 1.086 sec <<< FAILURE!
org.junit.ComparisonFailure: expected:<[My Org]> but was:<[New Org1]>
at org.junit.Assert.assertEquals(Assert.java:115)
at org.junit.Assert.assertEquals(Assert.java:144)
at com.abc.service.SettingsServiceTests.updateTest(SettingsServiceTests.java:57)
Spring将在您使用时回滚DB更新:
defaultRollback=true
根据我对“defaultRollback=true”的理解,测试框架将回滚每个测试方法的所有事务。在我的例子中,使用我正在执行的测试方法获取记录(settingsDaoImpl.getSettings()),更新记录(settingsDaoImpl.saveSetting(settings)),然后再次获取记录的值(settingsDaoImpl.getSettings()),我的测试期望在最后一次获取时更新值,但我们仍然获取旧值。任何想法。谢谢你的帮助。顺便说一句,我试过使用“defaultRollback=false”,但是没有用。有人能帮我吗?我做错了什么?我回答,因为我无法评论。我建议您参考以下链接:-我觉得您遇到了某种异常,请在调用数据库查询时放置try-catch块。尝试深入查看堆栈跟踪,您将找到解决方案。
@Repository
public class SettingsDaoImpl extends BaseDao{
private static final class SettingMapper implements RowMapper<Settings> {
public SettingMapper() {
super();
}
@Override
public Settings mapRow(final ResultSet rs, final int rowNum) throws SQLException {
final Settings settings= new Settings();
settings.setId(rs.getLong("id"));
settings.setOrgName(rs.getString("org_name"));
settings.setOrgAddress(rs.getString("org_address"));
settings.setOrgPhone(rs.getString("org_phone"));
settings.setLanguage(rs.getString("language"));
settings.setTimeZone(rs.getString("time_zone"));
settings.setCountry(rs.getString("country"));
settings.setCurrencyType(rs.getString("currency"));
return settings;
}
}
@Transactional(readOnly = true)
public Settings getSettings(){
final String sql = "select * from settings";
final Settings student = new Settings();
final SqlParameterSource paramSource = new BeanPropertySqlParameterSource(
student);
final List<Settings> result = this.getNamedParameterJdbcTemplate().query(
sql, paramSource, new SettingMapper());
if (result != null && !result.isEmpty()) {
return result.get(0);
}
return null;
}
@Transactional(readOnly = false)
public Settings saveSetting(Settings settings) {
Settings tSettings = null;
if (settings.isNew()) {
tSettings = insert(settings);
} else {
tSettings = update(settings);
}
return tSettings;
}
public Settings insert(Settings settings){
final String sql = "insert into settings (org_name, org_address, org_phone, language, time_zone, country, currency) "
+" values (:orgName, :orgAddress, :orgPhone, :language, :timeZone, :country, :currency)";
final GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
final String[] keyColumnNames = { "id" };
final SqlParameterSource paramSource = new BeanPropertySqlParameterSource(
settings);
final int count = this.getNamedParameterJdbcTemplate().update(sql,
paramSource, generatedKeyHolder, keyColumnNames);
settings.setId(generatedKeyHolder.getKey().longValue());
return settings;
}
public Settings update(final Settings settings) throws DataAccessException {
final StringBuilder updateClause = new StringBuilder();
SettingDb.getUpdateSql(updateClause);
final String sql = "update settings set org_name:=orgName, org_address:= orgAddress, " +
org_phone:=orgPhone, language:=language, time_zone:=timeZone, country:=country, currency:=currency where id=:id";
final GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
final String[] keyColumnNames = { "id" };
final SqlParameterSource paramSource = new BeanPropertySqlParameterSource(
settings);
final int count = this.getNamedParameterJdbcTemplate().update(sql,
paramSource, generatedKeyHolder, keyColumnNames);
return settings;
}
}
@Transactional(propagation = Propagation.NESTED)
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@ContextConfiguration(locations = {"classpath:spring/applicationContext.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class SettingsDAOTests {
@Autowired
private SettingsDaoImpl settingsDaoImpl;
@Test
public void testSettings(){
Settings settings = settingsDaoImpl.getSettings();
Assert.assertNotNull(settings);
String orgName = "New Org";
String orgAddress = "New Org Ad";
String phoneNumber = "Ph1";
String language = "Hindi";
String timeZone = "GMT";
String country = "US";
String currency = "Dollar";
settings.setCountry(country);
settings.setOrgAddress(orgAddress);
settings.setOrgName(orgName);
settings.setOrgPhone(phoneNumber);
settings.setLanguage(language);
settings.setTimeZone(timeZone);
settings.setCurrencyType(currency);
settingsDaoImpl.saveSetting(settings);
Settings settings1 = settingsDaoImpl.getSettings();
Assert.assertEquals(orgName, settings1.getOrgName());
Assert.assertEquals(orgAddress, settings1.getOrgAddress());
Assert.assertEquals(phoneNumber, settings1.getOrgPhone());
Assert.assertEquals(timeZone, settings1.getTimeZone());
Assert.assertEquals(country, settings1.getCountry());
Assert.assertEquals(currency, settings1.getCurrencyType());
String orgName1 = "New Org1";
String orgAddress1 = "New Org Ad1";
String phoneNumber1 = "Ph11";
String language1 = "Hindi1";
String timeZone1 = "GMT1";
String country1 = "US1";
String currency1 = "Dollar1";
settings.setCountry(country1);
settings.setOrgAddress(orgAddress1);
settings.setOrgName(orgName1);
settings.setOrgPhone(phoneNumber1);
settings.setLanguage(language1);
settings.setTimeZone(timeZone1);
settings.setCurrencyType(currency1);
settingsDaoImpl.saveSetting(settings);
Settings settings2 = settingsDaoImpl.getSettings();
Assert.assertEquals(orgName, settings2.getOrgName());
Assert.assertEquals(orgAddress, settings2.getOrgAddress());
Assert.assertEquals(phoneNumber, settings2.getOrgPhone());
Assert.assertEquals(timeZone, settings2.getTimeZone());
Assert.assertEquals(country, settings2.getCountry());
Assert.assertEquals(currency, settings2.getCurrencyType());
}
}
defaultRollback=true