为什么Mockito.when(...)。thenThrow(...)直接抛出错误

时间:2018-07-20 06:50:52

标签: java junit mockito

我有以下代码:

@Mock
private B b;

@InjectMocks
private A a;

@Test(expected = IOException.class)
public void test() {
    when(b.doSomething())
        .thenThrow(IOException.class);

    a.doSomethingWithB();
}

public class A {
    private B b;

    @Autowired
    public a(B b) {
        this.b = b
    }

    public boolean doSomethingWithB() {
        b.doSomething();
    }
}

实际上,该测试无法正常工作,当我调试它时,thenThrow行返回IOException,事实上,它从未进行过a.doSomethingWithB()

我的Mockito版本是2.19.1。

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

方法B#doSomething()无法引发IOException,因为它不是其签名的一部分。这就是Mockito不允许您执行thenThrow(IOException.class)的原因。

如果查看失败的测试的堆栈跟踪,就可以看到以下内容:

java.lang.Exception: Unexpected exception, expected<java.io.IOException> but was<org.mockito.exceptions.base.MockitoException>

    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
    at org.mockito.internal.junit.JUnitRule$1.evaluateSafely(JUnitRule.java:52)
    at org.mockito.internal.junit.JUnitRule$1.evaluate(JUnitRule.java:43)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    ....
Caused by: org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!

答案 1 :(得分:1)

问题是:您的模拟对象<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="add"> </div> <button id="add-el">Add</button> <button id="remove-el">Remove</button>没有注入到对象b中。要将模拟对象a注入到该测试类的b中,您需要使用a@RunWith(MockitoJUnitRunner.class)中的任意一个对测试类进行注释。