Java 只运行junit的安装方法一次

Java 只运行junit的安装方法一次,java,junit,spring-data-jpa,Java,Junit,Spring Data Jpa,我有一个测试类来测试JPA存储库的一些功能,我的JPA存储库与H2 db连接,我想用我的测试实体填充我的db,但在所有测试之前我只需要做一次,这是我的测试类: public class EntityRepositoryTest { @Autowired EntityJPARepository EntityRepo; Entity entity; @Before public void setup(){ entiti = //init

我有一个测试类来测试JPA存储库的一些功能,我的JPA存储库与H2 db连接,我想用我的测试实体填充我的db,但在所有测试之前我只需要做一次,这是我的测试类:

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
annotation在每个测试方法之前调用它,我不希望我的实体对象在H2 db中重复(因为
save
将在每个方法之前调用),我也不能使用annotation@BeforeClass,因为我需要在@autowired repository上调用
save
方法。如何在所有测试之前只调用一次安装程序,而在存储库自动连接之后调用它?

您可以使用注释 私有静态布尔初始化=false

@BeforeClass
  public static void init() {
    initialized = true;
  }
工作原理相同,仅适用于静态初始化。您应该在其中定义每个初始化。为什么你不可能


无论该方法是否已执行,您都可以保存在静态标志中。

您可以使用
@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

 }

或者,您可以在之后添加一个删除实体的方法。

before类存在问题。它是在静态方法上完成的,因为它是在测试类实例化之前运行的。这基本上意味着所有的
@Autowired
参数尚未设置<如果需要设置
@Autowired
字段,但只想运行该方法一次,则可以使用code>@BeforeTests方法。但是实例化一个标志EG将解决这个问题。然而,这不是很漂亮…

设置标志是解决此问题的一种方法,但我希望有另一种更干净的方法,它不需要混淆标志设置,因为不同文件中的It测试应该相互独立。根据我的经验,一个文件中的测试通常依赖于某种初始化。before和beforeclass是需要使用的概念。我同意:每个测试类“一次”的JUnit概念被称为@beforeclass。任何其他解决方案都类似于忽略“推荐做法”。我不知道为什么有人会否决这个答案。我不知道我怎么会不想到每次测试后都可以从存储库中删除所有数据,这是最简单的解决方案,可能也是最好的解决方案。谢谢如果您正在使用Spring(如
@Autowired
注释所示),请看一看。或者,如果您不喜欢XML,并且更喜欢JavaDSL,请尝试。在任何情况下,都不要依赖自己的代码来设置测试。为了确保每个测试的数据一致性,您应该在每个测试完成后回滚的事务中运行@Before将在同一事务中执行,因此任何插入都将在下一个测试执行之前回滚。请参阅:。您无需编写任何代码来处理此问题。添加@transactional annotation也可以解决我的问题,谢谢!