检查异常对此方法无效
checked exception is invalid for this method
我有以下class
Whosebug 中对此有一个答案,但它处理列表 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 块,因此编写了以下测试方法。它抛出以下异常。找不到我想念的地方。
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 消息。
您正在使用模拟错误进行单元测试。这里:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
模拟 正在测试的 class 没有 没有 点 !
当您 mock class 时,您会得到一个 stub,其中包含 "nothing to do" 与您的实际实现. "working setup" 看起来更像:
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); ...
然后您可以尝试 验证 例如记录器是否看到了预期的记录调用。换句话说:您要么使用模拟来允许您的被测代码完成其工作(您处于控制之中!)或验证某个预期的调用发生在模拟对象上。
但如前所述:模拟您要测试的 class 没有任何意义。因为模拟对象对 "real" 实现一无所知!
操纵环境,使 "doesSomething()" 抛出您想要的异常。由于我们不知道 "doesSomething()" 真正做什么,所以不能多说。
我有以下class Whosebug 中对此有一个答案,但它处理列表 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 块,因此编写了以下测试方法。它抛出以下异常。找不到我想念的地方。
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 消息。
您正在使用模拟错误进行单元测试。这里:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
模拟 正在测试的 class 没有 没有 点 !
当您 mock class 时,您会得到一个 stub,其中包含 "nothing to do" 与您的实际实现. "working setup" 看起来更像:
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); ...
然后您可以尝试 验证 例如记录器是否看到了预期的记录调用。换句话说:您要么使用模拟来允许您的被测代码完成其工作(您处于控制之中!)或验证某个预期的调用发生在模拟对象上。
但如前所述:模拟您要测试的 class 没有任何意义。因为模拟对象对 "real" 实现一无所知!
操纵环境,使 "doesSomething()" 抛出您想要的异常。由于我们不知道 "doesSomething()" 真正做什么,所以不能多说。