2016-07-14 251 views
0

对于我的应用程序,我想检查一个抛出两个Exceptions的函数。我想通过JUnit检查这些ExceptionsJunit测试:测试多个异常

下面的例子:

class MyFoo { 
    public void doSomeStuff(ArrayList<Object> objectList) { 
     if (objectList.size() >= 2) { 
      throw new IllegalArgumentException(""); 
     } 
     if (objectList.size() == 0) { 
      throw new IllegalArgumentException(""); 
     } else { 
      //do further Stuff 
     } 
    } 
} 

所以现在我要检查这个功能。我知道如何测试一个异常,但是有没有办法同时检查这两个异常?还是在自己的测试中检查每个异常更好?

这里测试一个例外:

public class MyFooTest { 

    @Rule 
    public ExpectedException thrown= ExpectedException.none(); 


    @Test 
    public void testDoSomeStuff() { 
     thrown.expect(IllegalArgumentException.class); 
     List<Object> objectList=new ArrayList<>(); 
     objectList.add(new Object()); 
     objectList.add(new Object()); 
     objectList.add(new Object()); 
     doSomeStuff(objectList); 
    } 
} 

可能是我完全错了,一次检查这两个例外。所以介绍一下。

+2

这两个异常都不会被抛出。你必须写两个测试用例。 –

回答

1

我会断言在两个不同的测试用例中引发了正确的异常。

@Test(expected = IllegalArgumentException.class) 
public void shouldThrowExceptionWhenListIsEmpty() { 
    doSomeStuff(Collections.emptyList()); 
} 

@Test(expected = IllegalArgumentException.class) 
public void shouldThrowExceptionWhenListIsBiggerThanTwo() { 
    doSomeStuff(Arrays.asList(new Object(), new Object(), new Object())); 
} 

如果一个约束条件发生变化,您只能更改一个测试。另一个保持不变。

1

您应该为特定情况创建两个测试。在这种情况下,每个异常都会使单元测试保持清洁和清晰。

1

我会强烈建议每个方法单路径情景理智的目的(如果你有一个测试17条的例外与测试失败,你要检查这些可能性都17),但你还问,如果它是可能的。当然,如果你想把所有东西放在一起,你可以在try/catch中使用assert.fail,其中一个预期的异常跳过了Fail语句。

@Test 
public void testDoSomeStuff() { 
    List<Object> objectList=new ArrayList<>(); 

    try { 
     doSomeStuff(objectList); 
     Assert.fail("Should throw IllegalArgumentException!"): 
    } 
    catch(IllegalArgumentException e) { 
     logger.info("Threw IllegalArgumentException as expected."); 
    } 

    objectList.add(new Object()); 
    objectList.add(new Object()); 
    objectList.add(new Object()); 

    try { 
     doSomeStuff(objectList); 
     Assert.fail("Should throw IllegalArgumentException!"): 
    } 
    catch(IllegalArgumentException e) { 
     logger.info("Threw IllegalArgumentException as expected."); 
    } 
} 
1

您可以有两种测试方法,并对每种类型的异常都有期望。在你的情况下,我认为你的逻辑只需要一个例外,因为你可以折叠你的条件:if (objectList.isEmpty() || (objectList.size() >= 2)) ...然后检查具有不同样本的IllegalArgumentException。另一方面,如果你真的想要分开,有两种方法有两种期望:@Test(expected = IllegalArgumentException.class)

@Test(expected = IllegalArgumentException.class) 
public void doSomeStuff1() { 
    doSomeStuff(Collections.emptyList()); 
} 

@Test(expected = IllegalArgumentException.class) 
public void doSomeStuff2() { 
    List<Object> sample = new ArrayList<Object>(); 

    for (int i = 0; i < 5; i++) { // Change `5` for something else if you want 
    sample.add(new Object()); 
    } 
    doSomeStuff(sample); 
}