unit-testing - 存根异常后,Mockito 存根不起作用
问题描述
所以,我试图在各种场景中对一个类进行单元测试。我们使用 JUnit V 4。
我有一个 setUp 方法,其中我 reStub 模拟以返回预期的模拟值。我有 4 个测试:test1-test4。test1,test2 与 perTestSetup 方法中配置的预期模拟值一起正常工作。
测试 t3 需要 MockClass 来抛出异常,所以我在 t3 中单独配置它。现在 t3 工作正常,因为模拟按预期抛出异常。
但是当 perTestSetup 在运行 test4 之前尝试重置 mock 以返回 mockResult 时,它会失败并抛出在 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(),因为这将是更准确的描述。
选项:
将注释更改为@BeforeEach,然后将更改行为以执行您认为当前应该执行的操作。但是,这将是低效的,因为在后两个测试中,您将定义行为,然后立即重新定义它。
functionCall(...) 中的参数是什么样的?可以在单个 @Before setup() 方法中定义两个单独的行为,即
when(MockClass.functionCall(good values)).thenReturn(mockResult);
when(MockClass.functionCall(bad values)).thenThrow(new RuntimeException());
在每个测试中,使用该特定测试的相关值调用 functionCall()。
- 如果 functionCall() 中的参数不能轻易适应以前的方法,请考虑创建两个单独的 MockClass 实例,例如
MockClass successfulMockClass = new mock(MockClass.class);
when(successfulMockClass()).thenReturn(mockResult);
MockClass unsuccessfulMockClass = new mock(MockClass.class);
when(unsuccessfulMockClass()).thenThrow(new RuntimeException());
在您的测试中,根据您正在测试的输入调用相关的模拟对象。
由于无法查看您课程的详细信息,我怀疑第二个选项是我想要的。不过,可能值得尝试所有这三个,看看哪个对你来说最直观。
推荐阅读
- .net - 在内存中运行 MassTransit/RabbitMQ 实例
- python - Python:当给定多个选项时,如何根据用户输入编写“响应”?
- visio - Visio 保护对象不被选择
- heroku - 尝试访问 Heroku CLI 时 IP 地址不匹配
- css - NavBar 起始位置 Mid Web
- r - 如何计算R中两个嵌套均值的差异?
- elasticsearch - ElasticSearch 中的隐式搜索词
- azure - CI/CD:使用托管专用终结点部署 Azure 数据工厂时出现“ResourceDeploymentFailure”
- html - 响应式网格模板列,一列具有固定百分比宽度,第二列具有自动宽度
- kotlin - 读取一系列未定义大小的数字并打印其第一次出现的最大数字和位置