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();
    }
}