JUnit“预期”似乎不起作用

时间:2014-01-13 11:32:53

标签: java exception testing junit

我有一个奇怪的问题,我正在尝试测试一个方法并期望它抛出java.util.NoSuchElementException。这是我的测试代码:

@Test(expected = NoSuchElementException.class)
    public void testLineWithoutCommas(){
    String lineToTest = "fdgsdgfdfMarkOwenmark@mark.com";
    List<String> linesToTest = new ArrayList<String>();
    linesToTest.add(lineToTest);

    applicationChecker = new ApplicationChecker();
    applicationChecker.getLinesFromFile(linesToTest);
    applicationChecker.getDetailsFromLine(applicationChecker.getLines().get(0));
}

堆栈跟踪看起来像预期的那样:

java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at java.util.StringTokenizer.nextElement(Unknown Source)
at com.scottlogic.cat.util.ApplicationChecker.getDetailsFromLine(ApplicationChecker.java:34)
at com.scottlogic.cat.utils.ApplicationCheckerTest.testLineWithoutCommas(ApplicationCheckerTest.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
and more boring stuff...

最后是jUnit:

java.lang.AssertionError: Expected exception: java.util.NoSuchElementException
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
and blah blah blah...

任何想法有什么不对?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

检查您是否在代码中的某处捕获并处理NoSuchElementException。第一个堆栈跟踪可能是由于您的代码捕获异常,然后记录它,并将其作为其他东西抛出,或者只是捕获它而不是丢弃它。 'expected'只会捕获从测试本身抛出的异常,它不会处理异常抛出并处理代码中的部分内容。

答案 1 :(得分:0)

试试吧

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

@Test
public void testLineWithoutCommas(){

exc.expect(NoSuchElementException.class);
// method have exception

}