我正在为我的Spring应用程序编写JUnit测试。对于其中一个场景我得到了异常
node -v
我已经阅读了其他一些问题和答案,但他们没有帮助。我遇到问题的情况非常简单。我想检查实体字段的唯一约束是否被强制执行。我创建了两个具有相同字段的实体,并期望出现约束违例异常。调用方法标记为Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly.
,因为如果发生异常,我希望整个事件回滚。
这是代码:
@Transactional
调用UserHelper类:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DeadlinesApplication.class)
@Rollback(value = false)
public class UserHelperTest {
@Autowired
private UserHelper userHelper;
@Test(expected = DataIntegrityViolationException.class)
@Transactional
public void uniqueUsername() throws NullParameterException {
User user = userHelper.createUser("uniq1", "password", null, null);
User user2 = userHelper.createUser("uniq2", "password", null, null);
User user3 = userHelper.createUser("uniq2", "password", null, null);
}
UserDAO的@Service
public class UserHelper {
@Autowired
private UserDAO userDAO;
public User createUser(...) throws NullParameterException {
User newUser = new User(username, ...);
userDAO.save(newUser);
return newUser;
}
方法随后在save()
上调用save()
:
UserRepository
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
public User findByUsername(String username);
}
唯一的地方是测试方法。它需要在那里,因为在一个单独的测试方法中,我懒惰加载多对多关系,并且需要在一个事务中发生。
你能看到这段代码有什么问题吗?
编辑:错误堆栈跟踪
@Transactional