【问题标题】:No expected exceptions are thrown while testing Spring Boot Repositories测试 Spring Boot 存储库时不会引发预期的异常
【发布时间】:2019-11-19 00:03:16
【问题描述】:

我想在对我的业务对象 Product 执行 CRUD 操作时检查一些验证:

Product类:

@Getter
@Setter
@Entity
@Table(name = "PRODUCT")
public class Product extends AbstractEntity<Long> {

    @Column(nullable = false)
    private String name;

    private String description;

    @Column(nullable = false)
    @Min(value = 0)
    private Float cost;

    @OneToMany(mappedBy = "product", fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SELECT)
    private Set<ProductRating> productRatings;

}

当我运行我的 Spring Boot 应用程序时,我得到了我想要的异常 (java.sql.SQLIntegrityConstraintViolationException),同时添加了 Product 而没有强制 name

@SpringBootApplication
public class QlturkaApplication implements CommandLineRunner {

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ProductRatingRepository productRatingRepository;

    public static void main(String[] args) {
        SpringApplication.run(QlturkaApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Product p = new Product();
        productRepository.save(p);

    }
}

但是当我运行测试时,没有nameProduct 被保存在数据库中,被持久化并且具有唯一ID,没有抛出异常,为什么?

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ContextConfiguration(classes = WebSecurityConfig.class)
public class ProductRepositoryTest {

    @Autowired
    private ProductRepository productRepository;


    @Test(expected = SQLIntegrityConstraintViolationException.class)
    public void nullProductNameThrowsError() {
        //java.sql.SQLIntegrityConstraintViolationException: Column 'cost' cannot be null
        Product product = new Product();
        product.setName(null);
        productRepository.save(product);
        System.out.println(product.getId());

    }

    public void afterTest(Product p) {
        productRepository.delete(p);
    }

}

【问题讨论】:

    标签: java spring spring-boot unit-testing junit


    【解决方案1】:

    因为data jpa tests 在每次测试结束时默认回滚,并且您永远不会在测试中显式刷新。因此,不会进行任何刷新,因此不会在表中插入任何内容,因此数据库无法告诉您您忘记插入名称。

    保存后在您的测试中调用flush()(或调用saveAndFlush())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-11
      • 2019-07-19
      • 2018-06-26
      • 2019-01-23
      • 2015-07-07
      • 2018-09-23
      • 1970-01-01
      • 2019-01-23
      相关资源
      最近更新 更多