在对异常进行存根后,Mockito存根不起作用

问题描述

因此,我正在尝试在各种情况下对类进行单元测试。我们使用JUnit V4。
我有一个setUp方法,其中我将模拟重新存根以返回预期的模拟值。 我有4个测试:test1-test4。 test1,test2与在perTestSetup方法中配置的预期模拟值一起正常工作。

测试t3需要MockClass引发异常,因此我在t3中单独配置了它。现在t3可以正常运行了,因为模拟程序按预期抛出了异常。

但是,当perTestSetup尝试重置模拟以在运行test4之前返回模拟结果时,它将失败并抛出在t4中配置的相同的运行时异常。在perTestSetup()中进行模拟之前,我还尝试过reset()。但这也同样失败。

我在这里想念什么?

@Before
public void perTestSetup(){ 
    when(MockClass.functionCall(...)).thenReturn(mockResult);
}

@Test
public void test1(){
}

@Test
public void test2(){
}

@Test
public void test3(){
    when(MockClass.functionCall(...)).thenThrow(new RuntimeExcption());
    ...
}

@Test
public void test4(){
}

解决方法

您的perTestSetup()方法没有执行您认为正在执行的操作。 @Before注释意味着测试环境将在执行任何测试之前运行一次此方法,而不是每个测试运行一次。在我阅读完您的问题之前,我实际上是在建议您将此方法重命名为setup(),因为这样做会更准确。

选项:

  1. 将注释更改为@BeforeEach,这将随后更改行为以执行您认为当前应该执行的操作。但是,这样做效率不高,因为在后两个测试中,您将定义行为,然后立即重新定义行为。

  2. 您的functionCall(...)中的参数是什么样的?可以在单个@Before setup()方法中定义两个单独的行为,即

when(MockClass.functionCall(good values)).thenReturn(mockResult);
when(MockClass.functionCall(bad values)).thenThrow(new RuntimeException());

在每个测试中,使用该特定测试的相关值调用functionCall()。

  1. 如果functionCall()中的参数不能很好地适应以前的方法,请考虑对MockClass进行两个单独的实例化,例如
MockClass successfulMockClass = new mock(MockClass.class);
when(successfulMockClass()).thenReturn(mockResult);
MockClass unsuccessfulMockClass = new mock(MockClass.class);
when(unsuccessfulMockClass()).thenThrow(new RuntimeException());

在测试中,根据要测试的输入,调用相关的模拟对象。

无法看到您班级的详细信息,我怀疑第二个选择是我要去的。不过,可能值得尝试所有这三个方法,以使您觉得最直观。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...