我有三个 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/