Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试单独成功,但当一起执行时失败并导致错误?_Java_Junit - Fatal编程技术网

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

Java JUnit测试单独成功,但当一起执行时失败并导致错误?,java,junit,Java,Junit,我有三个JUnit测试,如下所示。如果单独执行这些测试,即注释掉另外两个测试并仅执行一个测试,则这些测试都会成功 但是,如果我未注释地执行所有三个测试,则“testOrderDatabaseReturnsOrdersCorrectly”会产生错误,“testOrderDatabaseRemovesOrdersCorrectly”会失败 我真的不明白为什么会这样。我使用@Before在每个测试之前进行设置,所以所有三个测试的条件都应该相同?为什么他们中的一些人在个人表现良好时失败了 @Before

我有三个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);
}
但是,如果我未注释地执行所有三个测试,则“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()