Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 异常被存根后Mockito存根不工作_Unit Testing_Junit_Mockito_Junit4_Stubbing - Fatal编程技术网

Unit testing 异常被存根后Mockito存根不工作

Unit testing 异常被存根后Mockito存根不工作,unit-testing,junit,mockito,junit4,stubbing,Unit Testing,Junit,Mockito,Junit4,Stubbing,因此,我尝试在各种场景中对类进行单元测试。我们使用JUnit V4。 我有一个设置方法,其中我重新发布模拟以返回预期的模拟值。 我有4个测试:test1-test4。test1、test2与perTestSetup方法中配置的预期模拟值配合良好 测试t3需要MockClass抛出一个异常,所以我在t3中单独配置了它。现在t3工作正常,因为模拟会按预期抛出异常 但是,当perTestSetup在运行test4之前尝试重置mock以返回mockResult时,它失败并抛出t4中配置的相同运行时异常。

因此,我尝试在各种场景中对类进行单元测试。我们使用JUnit V4。
我有一个设置方法,其中我重新发布模拟以返回预期的模拟值。 我有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注释意味着测试环境将在执行任何测试之前运行此方法一次,而不是每次测试运行一次。在我读完您的问题之前,我真的很想建议您将此方法重命名为simply setup(),因为这将是一个更准确的描述

选项:

  • 将注释更改为@beforeach,这将更改行为,以执行您认为它当前应该执行的操作。然而,这将是低效的,因为在后两个测试中,您将定义行为,然后立即重新定义它

  • functionCall(…)中的参数是什么样子的?可以在单个@Before setup()方法中定义两种不同的行为,即

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

  • 如果函数CALL()中的参数不容易适应前面的方法,考虑两个单独的实例MOCKCH类,例如
  • 在测试中,根据要测试的输入调用相关的模拟对象


    在看不到你的课程细节的情况下,我怀疑第二种选择是我想要的。不过,这三种方法都值得一试,看看哪一种对您来说最直观。

    我在perTestSetup()中添加了一条日志行,用于在每次测试之前验证它是否执行。所以这个假设是正确的:2。不幸的是,参数是相同的。3.该类在DI上下文中使用,因此创建单独的mock似乎有些过分。无法将大量代码作为其组织共享。具体:——|。如果我没有得到答案,我将把它转换成一个通用的作品。
    when(MockClass.functionCall(good values)).thenReturn(mockResult);
    when(MockClass.functionCall(bad values)).thenThrow(new RuntimeException());
    
    MockClass successfulMockClass = new mock(MockClass.class);
    when(successfulMockClass()).thenReturn(mockResult);
    MockClass unsuccessfulMockClass = new mock(MockClass.class);
    when(unsuccessfulMockClass()).thenThrow(new RuntimeException());