2016-01-29 112 views
2

测试剪断:powermockito - 测试异常处理

void somefunction() { 
    try { 
    aMock.doSomething(); 
    bMock.another(); 
    } finally { 
    cMock.cleanup(); 
    } 
} 

测试:

@Test(expected = Exception.class) 
void sometest() { 
    ... setup various mocks ... 

    PowerMockito.doThrow(new Exception("abc")).when(aMock).doSomething(); 

    outerMock.somefunction(); 

    // ** THIS SHOULD FAIL 
    verify(bMock).another(); 

    // ** THIS SHOULD FAIL TOO 
    verify(cMock, never()).cleanup() 
} 

当我运行这个它传递。为什么? throw Exception(和@Test中的处理)是否胜过验证声明?

如果是这样 - 是否有某种方式来测试最后子句是否被执行?

回答

2

由于引发异常(对于真实情况),因此函数代码下的所有内容都是无效代码。

outerMock.somefunction(); // throw so, this is the end 

// ------- dead code blow: 
// ** THIS SHOULD FAIL 
verify(bMock).another(); 

// ** THIS SHOULD FAIL TOO 
verify(cMock, never()).cleanup() 

所以测试finally块,你必须使用一个正常执行(当没有发生异常)。另一个解决方案是在测试中使用一个try/catch:

try { 
    outerMock.somefunction(); 
    fail("was expecting an exception.."); 
} catch(Exception exception) { 
    // ignore 
} 

verify(bMock).another(); 
verify(cMock, never()).cleanup() 

要回答在评论的问题:假设代码

现在是:

void somefunction() { 
    try { 
     aMock.doSomething(); 
     bMock.another(); 
    } catch(Exception ex) { 
     cMock.handleException(ex); 
    } 
} 

的测试可能是:

Exception testEx = new Exception("testing") 
Mockito.when(aMock.doSomething()).thenThrow(testEx); 
instance.somefunction(); 
Mockito.verify(cMock).handleException(testEx); 
+0

有没有办法hav如果有'catch()'而不是'finally'这个工作, – ethrbunny

+0

如果你的生产代码中有一个catch,那么不会抛出异常,并且没有问题,你是什么意思? –

+0

验证catch()块中代码的操作/结果。 – ethrbunny