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

时间:2018-07-06 18:52:36

标签: 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);
}

2 个答案:

答案 0 :(得分:0)

  

但是,如果我不加注释地执行所有三个测试,则“ testOrderDatabaseReturnsOrdersCorrectly”会产生错误,而“ testOrderDatabaseRemovesOrdersCorrectly”将失败。

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

两种验证方式:

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

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

希望这会有所帮助。

答案 1 :(得分:0)

我已经弄清楚是什么原因导致了错误和奇怪的测试行为。

我有一个声明为静态的字段变量。由于某种原因,即使每次都重新设置sys变量,也不会在每次测试之前将其重置。当我删除该变量的静态声明时,所有测试均成功。