我有一个测试类来测试JPA存储库的一些功能,我的JPA存储库与H2 db连接,我想用我的测试entites填充我的数据库但是我需要在所有测试之前只执行一次,这是我的考试类:
public class EntityRepositoryTest {
@Autowired
EntityJPARepository EntityRepo;
Entity entity;
@Before
public void setup(){
entiti = //initializes entity with values
EntityRepo.save(entiti);
}
//some tests on repo
}
问题是@Before
注释在每个测试方法之前调用它,并且我不希望我的实体对象在H2 db中复制(因为save
将在每个方法之前调用),我也不能使用@BeforeClass注释,因为我需要在@autowired存储库上调用save
方法。如何在所有测试之前只调用一次安装程序,但在存储库获得自动装配之后仍然可以调用?
答案 0 :(得分:3)
您可以使用@Before
方法,只需要进行一些检查即可:
public class EntityRepositoryTest {
@Autowired
EntityJPARepository EntityRepo;
Entity entity;
@Before
public void setup() {
if (entity == null) { // true only for first pass
entity = //initializes entity with values
EntityRepo.save(entity);
}
}
//some tests on repo
}
或者,您可以添加删除实体的@After
方法。
答案 1 :(得分:1)
你可以使用注释 private static boolean initialized = false;
@BeforeClass
public static void init() {
initialized = true;
}
的工作方式相同,仅用于静态初始化。你应该在那里定义每个初始化。为什么这不适合你?
你可以保存在静态标志中,方法是否已经执行。
答案 2 :(得分:0)
@BeforeClass
有问题。它是在静态方法上完成的,因为它在实例化测试类之前运行。这基本上意味着尚未设置所有@Autowired
参数。在需要设置@BeforeTests
字段但只想运行一次的情况下,最好使用@Autowired
方法。但是实例化的标志EG将解决此问题。但是,它不是很漂亮...