java - JUnit 测试单独成功,但一起执行时失败并导致错误?

标签 java junit

我有三个 JUnit 测试,如下所示。如果单独执行这些测试,即注释掉其他两个测试并只执行一个测试,它们都会成功。

但是,如果我执行所有三个未注释的测试,则“testOrderDatabaseReturnsOrdersCorrectly”会产生错误,并且“testOrderDatabaseRemovesOrdersCorrectly”会失败。

我真的不明白为什么会发生这种情况。我在每次测试之前使用@Before进行设置,因此所有三个测试的条件应该相同?为什么其中一些在单独工作时表现良好却失败了?

@Before
public void setup()
{
    sys = new OrderSystem();
    sys.getDb().clearDb();
}


@Test
public void testOrderDatabaseAddsOrders()
{
    sys.getDb().clearDb();
    sys.createOrder(25);
    assertEquals(sys.getDb().getDbArrayList().size(), 1);

    sys.createOrder(30);
    assertEquals(sys.getDb().getDbArrayList().size(), 2);

    sys.createOrder(35);
    assertEquals(sys.getDb().getDbArrayList().size(), 3);
}


@Test
public void testOrderDatabaseRemovesOrdersCorrectly()
{
    sys.createOrder(25);
    assertEquals(sys.getDb().getDbArrayList().size(), 1);
    sys.removeOrder("BRICK1");
    assertEquals(sys.getDb().getDbArrayList().size(), 0);
}

@Test
public void testOrderDatabaseReturnsOrdersCorrectly()
{
    System.out.println("Size of db: " + sys.getDb().getDbArrayList().size());
    sys.createOrder(25);
    System.out.println("Size of db: " + sys.getDb().getDbArrayList().size());
    BrickOrder o = sys.getOrder("BRICK1");
    assertEquals(o.getNumberOfBricks(), 25);
}

最佳答案

However, if I execute all three tests uncommented then "testOrderDatabaseReturnsOrdersCorrectly" produces an error and "testOrderDatabaseRemovesOrdersCorrectly" fails.

您的问题很可能是当运行下一个测试方法时,其中一个测试方法的结果没有被清除,并且它们发生冲突。也许您正在使用像 H2 这样的内存数据库,即使您调用 sys.getDb().clearDb();,该数据库也没有被完全清除?

有几种方法可以验证这一点:

  • 首先将 System.out.println() 消息放入 setup() 中,以确保在每个方法之前调用它。
  • 在测试方法开始时,在数据库中进行查找,看看是否有结果来验证 clearDb() 做了什么。我怀疑您会发现它无法完全正常工作。
  • 更改测试方法以使用非重叠表格或使用非重叠数据来查看是否有效。例如,创建一个 int orderNumber 字段,并在每个测试方法中对其执行 ++ 以确保您使用的是新订单。当然,这是一种解决方法。最好理解为什么clear没有做你想做的事。

如何解决这个问题是一个更复杂的问题,取决于实际支持您的数据库的内容。也许您的 clearDb() 方法中存在一些错误。我提到 H2 是因为即使你设置了一个全新的数据库连接,旧的数据库连接也不会被破坏并且会被重用。如果它是 SQL 数据库,完全删除表并重新创建它们是一件事,甚至会迫使像 H2 这样的持久内存数据库清除其内容。

希望这有帮助。

关于java - JUnit 测试单独成功,但一起执行时失败并导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51216207/

相关文章:

java - 调试 Junit 时,Eclipse 中未命中断点

junit - 我们是否应该定义我们的接口(interface)以使其更易于测试?

java - 需要动态方法分派(dispatch)示例的帮助

java - 运行测试时出现 java.lang.InknownClassChangeError

java - 计算 Ant 执行的 JUnit 测试的总和

java - 一起运行时 Android JUnit 测试挂起

java - Junit 测试共享相同的数据对象?我应该 mock 它还是什么?

java - 每次都必须声明 HttpUrlConnection 吗?

java - 从 Java 捕获鼠标点击并用作热键?

java - 为什么android无法识别loadurl方法?