仅运行一次junit的setup方法

时间:2016-08-25 11:40:36

标签: java junit spring-data-jpa

我有一个测试类来测试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方法。如何在所有测试之前只调用一次安装程序,但在存储库获得自动装配之后仍然可以调用?

3 个答案:

答案 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将解决此问题。但是,它不是很漂亮...