Saw*_*yer 3 java junit mockito powermockito
我有下面的类在StackOverflow中有一个答案,但是它处理了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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试方法如下所示。我尝试使用JUnit运行覆盖范围,但未覆盖Catch块,因此编写了以下测试方法。它引发以下异常。无法到达我想念的地方。
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());
}
}
Run Code Online (Sandbox Code Playgroud)
抛出异常
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: java.lang.Exception
Run Code Online (Sandbox Code Playgroud)
编辑
我可以通过提供NullPointerException来运行该方法。当我尝试使用Junit进行代码覆盖时,catch块完全显示为红色,并且catch短语显示为黄色。如何实现100%的覆盖率以及如何在catch块中测试String消息。
您正在使用错误的模拟进行单元测试。这里:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Run Code Online (Sandbox Code Playgroud)
有没有在嘲笑的类,它是点测试!
当你嘲笑这个类,你会得到一个存根具有“无关”你真正的实现。“工作设置”看起来更像是:
public void methodUnderTest(X x, ...) {
try {
x.foo();
} catch (Exception e) {
...
}
Run Code Online (Sandbox Code Playgroud)
和
X mockedX = mock(X.class);
when(x.foo()).thenThrow(new WhateverException());
underTest.methodUnderTest(mockedX); ...
Run Code Online (Sandbox Code Playgroud)
然后您可以尝试验证例如记录器是否看到了预期的记录调用。换句话说:您可以使用一个模拟来允许您的被测代码完成其工作(在您的控制之下!),或者验证某个模拟对象是否发生了预期的调用。
但是如前所述:模拟您要测试的类没有任何意义。因为模拟对象对“真实”实现一无所知!