使用Junit5和Mockito测试错误处理方法的怪异度

时间:2019-04-24 13:22:07

标签: java mockito junit5

我正在对执行某些异常处理的方法进行单元测试。这是我要测试的简化类:

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块甚至没有运行。怎么可能呢?

2 个答案:

答案 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