我有以下代码:
@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。
感谢您的回答。
答案 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)
中的任意一个对测试类进行注释。