最近在使用AbstractJpaTests的时候,出现了一个比较奇怪的问题:
代码清单1:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/appContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class AdvancedGroupServiceImplTest extends AbstractJpaTests {
private IAdvancedGroupService agService;
public final void setAgService(IAdvancedGroupService agService) {
this.agService = agService;
}
/**
* 测试创建一个Group对象,不提供任何父组对象,也不提供创建者对象
*/
public void testNormalCrateGroupWithNoParentAndNoUser() {
init();
Group g = new Group();
g.setName("group1");
this.agService.createGroup(null, g, null, false, false);
assertNotNull(g.getId());
Group g2 = this.groupService.getGroup(g.getId());
assertNotNull(g2);
assertEquals("group1", g2.getName());
assertEquals(UserContext.getTanent(), g2.getTanent());
}
}
在这个测试用例中,我创建了一个Group对象,并保存,完成测试后,事务自动回滚。该测试列运行情况正常。
下面另一个测试列:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/appContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class GlobalsMethodsFactoryTest extends JpaDaoTest {
private IGlobalsMethodsFactory gmFactory;
public final void setGmFactory(IGlobalsMethodsFactory gmFactory) {
this.gmFactory = gmFactory;
}
public void testIsSystemAdministrator() {
init();
User user = new User();
user.setUserName("user");
user.setPassword("user");
Permission p = new Permission();
p.setName(StaticResource.ROLE_ADMINISTRATOR);
this.pService.createPermission(null, p, null);
this.uService.addPermission2User(null, p, user);
assertTrue(this.gmFactory.isSystemAdministrator(user));
}
}
在这个测试列中,gmFactory.isSystemAdministrator(User)方法会执行一次数据库查询,而就是这个查询,我估计将之前所有保存的事务点全部提交了,虽然测试通过了,但是测试的数据却提交到了数据库,这个是不能忍受的。
在javaeye里面找到了相同的疑问,但都没有看到回复。最后还是在spring的论坛上找到了答案,原来很简单,把表设置成innoDB类型就OK了。