我有以下课程 StackOverflow中有一个答案,但它处理List throw checked Exceptions from mocks with Mockito。我喜欢看这个情况。没有得到我失踪的地方。
public SimpleClass{
private SimpleClass(){}
public void runMethod(request,String,Map,Object,Object){
try{
doesSomething()....
}
}
catch(Exception e){
String message= ""+request.getAttribute(X)+"Some message"
Logger.Log(param1+param2+message);
}
}
我的测试方法如下所示。我试图用JUnit运行覆盖,但Catch Block没有覆盖,所以写下面的测试方法。它引发了以下异常。无法到达我失踪的地方。
public class SimpleClassTest{
@Test
public void testCatchBlock(){
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Mockito.doThrow(new Exception()).when(instanceObj).runMethod(request, anyString(), anyMap(), anyObject(), anyObject());
}
}
异常抛出
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: java.lang.Exception
修改
我可以通过提供NullPointerException来运行该方法。当我尝试使用Junit进行代码覆盖时,catch块完全显示为红色,并且catch短语显示为黄色。如何实现100%覆盖率以及如何在catch块中测试String消息。
答案 0 :(得分:4)
您正在通过模拟错误进行单元测试。这里:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
没有点模拟在测试中的类!
当您模拟该类时,您会得到一个存根,其中包含"无所事事"与您真正的实施。 A"工作设置"看起来更像是:
public void methodUnderTest(X x, ...) {
try {
x.foo();
} catch (Exception e) {
...
}
和
X mockedX = mock(X.class);
when(x.foo()).thenThrow(new WhateverException());
underTest.methodUnderTest(mockedX); ...
然后你可以尝试验证,例如记录器看到了预期的日志记录调用。换句话说:你要么使用模拟来允许你正在测试的代码来完成它的工作(你在控制中!)或验证某些预期的调用发生在模拟对象上。
但是如上所述:嘲笑你要测试的那个类没有任何意义。因为被嘲笑的对象并不知道关于"真实"执行!
答案 1 :(得分:0)
操纵环境,以便"做某事()"抛出你想要的例外。因为我们不知道"做什么()"真的不能说更多。