首页 > 解决方案 > 存根异常后,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(){
}

标签: unit-testingjunitmockitojunit4stubbing

解决方案


您的 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());

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

由于无法查看您课程的详细信息,我怀疑第二个选项是我想要的。不过,可能值得尝试所有这三个,看看哪个对你来说最直观。


推荐阅读