Junit 测试 5(异常)

Junit test 5 (Exception)

我正在做一个 Junit 测试,在其中一个测试中我遇到了问题,但我不明白为什么。

你不必允许在任何给定时间将更多对象添加到列表中,即列表的大小大于 5,简而言之,如果我将第六个对象添加到列表中,则异常必须跳过,但我不明白为什么它不起作用,我留下我正在做的代码。

代码:

 @Test
 void testAddTank() throws KeeperException, TankException {  
  List<Tank> NumTanques = new ArrayList<Tank>();

  Tank tank1 = new Tank("TANQUE1","pedro1","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank2 = new Tank("TANQUE2","pedro2","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank3 = new Tank("TANQUE3","pedro3","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank4 = new Tank("TANQUE4","pedro4","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank5 = new Tank("TANQUE5","pedro5","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank6 = new Tank("TANQUE6","pedro6","hola",3.0,2.0,1.0,"/image",17.0,7);
  Tank tank7 = new Tank("TANQUE7","pedro6","hola",3.0,2.0,1.0,"/image",17.0,7);

  NumTanques.add(tank1);
  NumTanques.add(tank2);
  NumTanques.add(tank3);
  NumTanques.add(tank4);
  NumTanques.add(tank5);

  assertEquals(5, NumTanques.size());

  KeeperException excepcionTanques = assertThrows(KeeperException.class,()->NumTanques.add(tank6));
  assertEquals("[ERROR] A keeper cannot care of more than 5 
  thanks!!",excepcionTanques.MSG_ERR_MAX_TANKS);

}

如您所见,我创建了 tank 类型的列表并创建了一些 tank 对象,并将其添加到列表中。然后用断言我告诉你的是 5 必须是列表的大小,这样它 returns true ...

然后在我创建的异常中,我将一个新坦克添加到列表中,异常应该跳转,但它没有跳转,它退出并在行上给出错误:

 KeeperException excepcionTanques = assertThrows(KeeperException.class,()->NumTanques.add(tank6));

我没看清楚是怎么回事。

我非常怀疑 Java class ArrayList 会像您描述的那样抛出异常:

List<Tank> NumTanques = new ArrayList<Tank>();

因此,如果您希望抛出该异常,您可能需要使用自定义 class 来跟踪添加的坦克,而不是使用普通的 ArrayList。也许首先找到实际抛出 KeeperException.

的代码

list.add 仅抛出此处提到的异常 https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E).

所以预计问题中提到的行会给你编译错误。

如果您仍想在 list.add 上断言,请使用 java 文档中提到的任何异常。

可能是这样的--

UnsupportedOperationException e= assertThrows(UnsupportedOperationException.class,()->NumTanques.add(tank6));

为什么 Arraylist 如果你向它添加任何东西就会抛出异常。它有自己的算法来管理加法。

您需要做的是在您的 service class(也许 KeeperService.java

中添加一个方法

并在那里抛出异常。 像

@sneakyThrows
public void countKeeperCheck(Object o){

List<Tank> NumTanques = new ArrayList<Tank>();
NumTanques.add(o);

if(listOfBanks.size() >5){
throw new KeeperException("write whatever here")
}
}

//add to try/catch if you have specific things to handle

并且您可以从测试中调用该方法。 您不能在测试中编写业务逻辑。从测试中调用保存业务逻辑的方法。

----------------评论和详细代码后编辑----------------

public void addTank(List<Tank> tank) throws KeeperException{// in the comment you add wrong signature, method should accept List, the only you will have contains operation

        if(tanks.size()>=5){
        throw new KeeperException(KeeperException.MSG_ERR_MAX_TANKS);
        }

        if(!tanks.contains(tank)){
            tanks.add(tank);
    }
}


// and this is how your test will look like
@Test
 void testAddTank() throws KeeperException, TankException {
         List<Tank> NumTanques = new ArrayList<Tank>();

        Tank tank1 = new Tank("TANQUE1","pedro1","hola",3.0,2.0,1.0,"/image",17.0,7);
        Tank tank2 = new Tank("TANQUE2","pedro2","hola",3.0,2.0,1.0,"/image",17.0,7);
        Tank tank3 = new Tank("TANQUE3","pedro3","hola",3.0,2.0,1.0,"/image",17.0,7);
        Tank tank4 = new Tank("TANQUE4","pedro4","hola",3.0,2.0,1.0,"/image",17.0,7);
        Tank tank5 = new Tank("TANQUE5","pedro5","hola",3.0,2.0,1.0,"/image",17.0,7);
        Tank tank6 = new Tank("TANQUE6","pedro6","hola",3.0,2.0,1.0,"/image",17.0,7);

        NumTanques.add(tank1);
        NumTanques.add(tank2);
        NumTanques.add(tank3);
        NumTanques.add(tank4);
        NumTanques.add(tank5);


        KeeperException excepcionTanques = assertThrows(KeeperException.class,()->yourServiceClass.addTank(tank6));
        assertEquals("[ERROR] A keeper cannot care of more than 5  thanks!!",excepcionTanques.MSG_ERR_MAX_TANKS);
        }

以您想要的方式声明YourServiceClass