【发布时间】: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);
}
}
但是当我运行测试时,没有name 的Product 被保存在数据库中,被持久化并且具有唯一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