spring transactional junit tests不能在linux上回滚

时间:2013-08-05 16:08:14

标签: spring junit4

我有一个基于Spring的Java EE Web应用程序。我正在使用junit测试存储库层(数据访问对象层)。我使用maven来构建和测试我的项目。

我的问题是: 当我在Windows上运行测试时,spring的自动/默认回滚行为工作,但是,当我部署到我的linux开发服务器并尝试运行测试时,回滚行为似乎不起作用

这是一个示例表。请注意,用户名字段被指定为唯一。

create table user (
 id mediumint not null auto_increment,
 username varchar(50),
 passwd varchar(50),
 unique(username)
);

这是我的普通旧java对象(pojo)建模这个表。

@Entity
@Table(name="user")
public class User {
 @Column(name="id")
 public int id;
 @Column(name="username")
 public String username;
 @Column(name="passwd")
 public String passwd;

 public void User() { }

 public void User(String username, String passwd) {
  this.username = username;
  this.passwd = passwd;
 }
}

然后我有一个JPA存储库来保存用户,如下所示。

@Repository
public class JpaUserRepository {
 @PersistenceContext
 EntityManager em;

 public User find(int id) {
  User user = this.em.find(User.class, id);
  return user;
 }

 public void save(User user) {
  this.em.persist(user);
 }

 public void delete(User user) {
  this.em.remove(user);
 }
}

我使用junit的单元测试如下。

@ContextConfiguration(locations={"classpath:spring/business.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class JpaUserRepositoryTests {
 @AutoWired
 UserRepository userRepository;

 @Test
 @Transactional
 public void testSave() {
  User user = new User("user1","pw");
  userRepository.save(userRepository);

  user = userRepository.find(user.id);
  Assert.assertNotNull(user);
 }

 @Test
 @Transactional
 public void testDelete() {
  User user = new User("user1","pw");
  userRepository.save(userRepository);

  user = userRepository.find(user.id);
  Assert.assertNotNull(user);

  userRepository.delete(user);

  user = userRepository.find(user.id);
  Assert.assertNull(user);
 }
}

再次,在Windows上,当我运行“mvn clean test”时,我没有失败。但是,当我在我的linux(CentOS 6.4 x64)框中运行它时,由于“user1”值,我得到一个org.hibernate.exception.ConstraintViolationException。

我在stackoverflow上做了一些搜索。这是我试过的。

  • 将@Rollback注释用于**测试类中的每个方法。
  • 在所有**测试类的类级别使用@TransactionConfiguration(defaultRollback = true)。
但是,这些修改都不起作用。

请注意我的Windows与Linux环境的版本和/或差异。我不确定他们会有所作为。

  • spring framework 3.2.2.RELEASE
  • spring jpa 1.3.1.RELEASE
  • maven surefire plugin 2.15
  • maven 3.0.5(Linux上的3.1.0版本)
  • junit 4.11
  • JDK 1.7
  • MySql 5.6.11(Linux上的5.1.69版本)

另外,请注意在“mvn clean test”之后,在windows上,如果我做了

select * from user;

然后我得到0结果。但在linux上,我确实看到用户行/记录在表中。这就是我认为回滚不适用于linux的原因。

1 个答案:

答案 0 :(得分:0)

好的,所以这就是发生的事情。

在我的Windows框中,我使用的是MySQL v5.6.11。 在我的linux机器上,我使用的是MySQL v5.1.69。

根据此链接http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html,innodb是从v5.5开始的默认存储引擎,在v5.5之前,myisam是默认的存储引擎。

根据此链接http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html,它强化了myisam是v5.1中的默认存储引擎。

所以,在我的linux机器上,我在v5.1.69上,默认存储是myisam,因此,spring的自动回滚机制从未起作用。