【问题标题】:running setup method for junit only once只运行一次junit的设置方法
【发布时间】:2016-08-25 11:40:35
【问题描述】:

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

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

【问题讨论】:

  • 为确保每次测试的数据一致性,您应该在每次测试完成后回滚的事务中运行。 @Before 将在同一个事务中执行,因此任何插入都将在下一个测试执行之前回滚。见:stackoverflow.com/questions/17308335/before-and-transactional。然后,您无需编写任何代码来处理此问题。
  • 添加@transactional注解也解决了我的问题,谢谢!

标签: java junit spring-data-jpa


【解决方案1】:

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

【讨论】:

  • 我不知道每次测试后我都可以从存储库中删除所有数据,这是最简单的解决方案,也可能是最好的解决方案。谢谢!
  • 如果您使用的是 Spring(如 @Autowired 注释所示),请查看 spring-test-dbunit。或者,如果您不喜欢 XML,并且您更喜欢 Java DSL,请尝试 DbSetup。无论如何,我们的想法是不要依赖您自己的代码来设置测试。
【解决方案2】:

你可以使用注解 私有静态布尔初始化 = false;

@BeforeClass
  public static void init() {
    initialized = true;
  }

工作原理相同,只是用于静态初始化。你应该在那里定义每个初始化。为什么这不适合你?

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

【讨论】:

  • 设置标志是解决此问题的一种方法,但我希望有另一种更清洁的方法,不需要搞乱标志设置
  • 不同文件中的单元测试应该相互独立。根据我的经验,一个文件中的测试通常依赖于某种初始化。 before 和 beforeclass 是要使用的概念。
  • 我同意:每个测试类执行“一次”的 JUnit 概念称为 @BeforecClass。任何其他解决方案就像忽略“推荐的做法”。不知道为什么有人会否决这个答案。
【解决方案3】:

@BeforeClass 有问题。它是在静态方法上完成的,因为它在测试类的实例化之前运行。这基本上意味着尚未设置所有@Autowired 参数。 @BeforeTests 方法在您需要设置 @Autowired 字段但只想运行该方法一次的情况下将不胜感激。但是实例化的标志 EG 将解决这个问题。然而它不是很漂亮......

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多