Java JUnit测试单独成功,但当一起执行时失败并导致错误?
我有三个JUnit测试,如下所示。如果单独执行这些测试,即注释掉另外两个测试并仅执行一个测试,则这些测试都会成功 但是,如果我未注释地执行所有三个测试,则“testOrderDatabaseReturnsOrdersCorrectly”会产生错误,“testOrderDatabaseRemovesOrdersCorrectly”会失败 我真的不明白为什么会这样。我使用@Before在每个测试之前进行设置,所以所有三个测试的条件都应该相同?为什么他们中的一些人在个人表现良好时失败了Java JUnit测试单独成功,但当一起执行时失败并导致错误?,java,junit,Java,Junit,我有三个JUnit测试,如下所示。如果单独执行这些测试,即注释掉另外两个测试并仅执行一个测试,则这些测试都会成功 但是,如果我未注释地执行所有三个测试,则“testOrderDatabaseReturnsOrdersCorrectly”会产生错误,“testOrderDatabaseRemovesOrdersCorrectly”会失败 我真的不明白为什么会这样。我使用@Before在每个测试之前进行设置,所以所有三个测试的条件都应该相同?为什么他们中的一些人在个人表现良好时失败了 @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);
}
但是,如果我未注释地执行所有三个测试,则“testOrderDatabaseReturnsOrdersCorrectly”会产生错误,“testOrderDatabaseRemovesOrdersCorrectly”会失败
您的问题很可能是当运行下一个测试方法时,其中一个测试方法的结果没有被清除,并且它们相互冲突。也许您正在使用一个内存数据库,比如H2,它没有被完全清除,即使您正在调用sys.getDb().clearDb()代码>
有两种方法可以验证这一点:
- 首先在
setup()
中放入一条System.out.println()
消息,以确保在每个方法之前调用它
- 在测试方法开始时,在数据库中进行查找,查看是否有结果来验证
clearDb()
是否执行了某些操作。我想你会发现它没有完全发挥作用
- 将测试方法更改为使用非重叠表或使用非重叠数据,以查看其是否有效。例如,创建一个
intordernumber
字段,并在每个测试方法中对其执行一个++
,以确保使用新的顺序。这当然是一个变通办法。最好能理解为什么clear没有做你想做的事情
如何解决这个问题是一个更复杂的问题,它取决于支持db
的实际内容。也许您的clearDb()
方法中有一些bug。我之所以提到H2,是因为即使您建立了一个全新的数据库连接,旧的数据库连接也不会被破坏,并且会被重用。如果它是一个SQL数据库,那么完全删除表并重新创建它们是一件事,它甚至会迫使像H2这样的持久内存数据库清除其内容
希望这能有所帮助。我已经找出了导致错误和奇怪测试行为的原因
我有一个声明为静态的字段变量。由于某些原因,在每次测试之前都没有重置,即使每次都重置sys变量。当我删除这个变量的静态声明时,所有的测试都成功了。是sys
声明的static
?声明的静态在哪里@如果你的意思是在测试类中,没有,它只是声明了private OrderSystem sys
Post足够的代码来重现这个问题。错误是什么?db只是一个ArrayList,出于语义考虑,我称它为db。clear方法实际上就是AL.clear()代码>在每次测试之前调用设置。我只是不明白,当测试以完全相同的条件开始时,这怎么会发生,就像它们是自己执行的一样。到底是什么在@Jakemangan1失败?您的arraylist的条目数是否错误?它有多少个?你试过调试它吗?啊哈。因此,您的订单计数器或自动生成名称的东西是静态的。有道理。当然奇怪的是,订单的名称是自动创建的,当您以后依赖它成为“BRICK1”
。也许你应该把名字传给你的createOrder()
。