Spring Boot事务测试允许违反更新的唯一约束

时间:2017-04-19 16:53:09

标签: jpa spring-boot integration-testing transactional

我有一个DB(Postgres)表,其中一列有唯一约束。我有一个标有@Transactional注释的测试,它将该唯一列值更新为非唯一值。我希望更新操作失败,但它会成功执行。此外,当我从数据库中获取更新对象(在同一事务内)时,列值将在那里更新。

JPA实体的简化版本:

@Entity
@Table(name = "entities")
public class Entity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    // The unique column
    @Column(name = "name", unique = true)
    @NotNull
    private String name;

    ...
}

测试的简化版本:

@Test
@Transactional
public void test() {
    Entity firstEntity = new Entity();
    firstEntity.setName("First Entity Name");

    // This just calls corresponding JPA repository .save method
    entityService.create(firstEntity);

    Entity secondEntity = new Entity();
    secondEntity.setName("Second Entity Name");
    entityService.create(secondEntity);

    // Update name to a not unique value
    secondEntity.setName(firstEntity.getName);

    // This calls corresponding JPA repository .save method. 
    // It also catches DataIntegrityViolationException and throws 
    // a more user friendly exception instead
    entityService.update(secondEntity);
}

如果删除@Transactional注释或提交事务,此代码可以正常工作。我也尝试按照建议here调用EntityManager.flush(),但是这个代码在刷新结果数据后抛出ConstraintViolationException,因此我无法测试我的entityService.update方法是否正常工作并抛出正确的异常。 / p>

请注意,如果我尝试创建在事务测试中没有唯一数据的新条目(不更新),那么测试按预期工作 - 如果未创建唯一实体,则抛出DataIntegrityViolationException。

有人可以澄清是否有可能使更新方案按预期工作,保持测试事务处理,这样我就不需要关心数据清理了吗?

0 个答案:

没有答案