Java 单元测试中的模拟/存根运行时异常
在Java 单元测试中的模拟/存根运行时异常,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,在学校课上,我有一个start()函数,它调用另一个函数doTask(): 我想用RuntimeException进行单元测试start(): @Test public void testStartWithException() { // How can I mock/stub mySchool.start() to throw RuntimeException? mySchool.start(); } 对于我的实现代码来说抛出RuntimeException并不容易,如何让测试代码模
学校
课上,我有一个start()
函数,它调用另一个函数doTask()
:
我想用RuntimeException
进行单元测试start()
:
@Test
public void testStartWithException() {
// How can I mock/stub mySchool.start() to throw RuntimeException?
mySchool.start();
}
对于我的实现代码来说抛出RuntimeException
并不容易,如何让测试代码模拟RuntimeException并抛出它
(除了纯JUnit,我正在考虑使用,但不确定如何抛出RuntimeException)
您可以使用
when
和以及throw
来抛出异常。您可以使用PowerMockito模拟私有方法来抛出运行时异常。大概是这样的:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.mockito.PowerMockito.doThrow;
import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest(School.class)
public class SchoolTest {
@Test
public void testStartWithException() throws Exception {
School school = spy(new School());
doThrow(new RuntimeException()).when(school, "doTask");
school.start();
}
}
doTask()抛出异常的原因可能重复?如果是因为错误的输入,只需在测试中使用错误的输入即可。如果是因为与服务的交互出现意外问题,您需要模拟或删除该服务,使其抛出异常以模拟该问题。我不认为start()是应该抛出异常的方法。我同意上述评论。我认为用户在执行doTask()方法时预期会出现异常。这看起来更像Leem.fin所寻找的答案,但是每当您必须使用Powermockito而不是Mockito时,这可能是设计可以改进的迹象。
@Test
public void testStartWithException() {
// How can I mock/stub mySchool.start() to throw RuntimeException?
when(mySchool.start()).thenThrow(new RuntimeException("runtime exception"));
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.mockito.PowerMockito.doThrow;
import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest(School.class)
public class SchoolTest {
@Test
public void testStartWithException() throws Exception {
School school = spy(new School());
doThrow(new RuntimeException()).when(school, "doTask");
school.start();
}
}