我正在对执行某些异常处理的方法进行单元测试。这是我要测试的简化类:
class Foo{
private BarService bar;
public int MethodToTest(){
try{
bar.methodThatThrows();
return 1;
}catch(Exception e){
return 0;
}
}
}
这是单元测试类。
class FooTest{
private IBarService barService = mock(BarService.class);
@Test
TestMethodToTest(){
when(barService.methodThatThrows()).thenThrow(new Exception("message");
Foo foo = new foo();
ReflectionTestUtils.setField(foo, "barService", barService);
assertEquals(foo.MethodToTest(), 0);
}
}
以某种方式,当我运行它时,它会失败,因为抛出了一个错误(如预期的那样),该错误具有与我放入模拟服务中的消息完全相同的消息。当我在调试模式下运行时,catch块甚至没有运行。怎么可能呢?
答案 0 :(得分:0)
您很有可能在测试中抛出了未声明为methodThatThrows
的已检查异常
您在测试中声明的消息确实已打印到控制台,但该消息更有意义:
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: java.lang.Exception: message
例如(在BarService中声明了IOException,但在测试代码中抛出了更一般的检查异常):
public class BarService {
public int methodThatThrows() throws IOException {
return 1;
}
}
答案 1 :(得分:-1)
您没有在示例代码中正确设置BarService
。您正在执行:
ReflectionTestUtils.setField(foo, "barService", barService);
但是在Foo
类中,BarService
变量称为“ bar”,而不是“ barService”,因此您需要这样做:
ReflectionTestUtils.setField(foo, "bar", barService);
“正确”的方法是使用Spring将BarService
自动连接到Foo
,这使您不必首先使用ReflectionTestUtils
。