当前位置: 首页 > 知识库问答 >
问题:

莫基托的疑惑

壤驷向明
2023-03-14

我对莫基托有疑问。我想测试这个简单的类:

public class MyClass{
    private UserService userService;
    public void deleteUser(){
       userService.getAdminUser(1);
       userService.deleteUser(0);
    }
}

我写了这个简单的测试:

@RunWith(MockitoJUnitRunner.class)
    public class MyClassTest {
       @MockitoAnnotations.Mock
       private UserService userService;

        @Test
        public void test(){
           MyClass  myClass=new MyClass();
           myClass.userService=userService;
           myClass.deleteUser();
        }
    }

此测试运行时没有错误。我等待它没有编译,因为没有任何对userService方法的调用…

共有3个答案

云鸿达
2023-03-14

下面是如何使用一组不调用注释的不同方法来测试它。请注意,这是TestNG,但将其适配到JUnit4+很容易:

import static org.mockito.Mockito.*;

public final class Test
{
    private UserService userService;

    @BeforeMethod
    public void init()
    {
        userService = mock(UserService.class);
    }

    @Test
    {
         final MyClass  myClass = new MyClass();
         myClass.userService = userService;
         myClass.deleteUser();
         verify(userService, times(1)).getAdminUser(1);
         verify(userService, times(1)).deleteUser(0);
    }
}

请注意,有一个只有一个参数的verify()变量,它与第二个参数为times(1)完全等价。还有never()

例如,如果您希望测试.deleteuser()方法没有使用任何参数调用,则可以执行以下操作:

verify(userService, never()).deleteUser(anyInt());
强安和
2023-03-14

您没有添加任何检查以查看是否以任何方式使用了userService。添加验证将为您完成以下操作:何时使用mockito.verify()?

我建议您阅读Mockito在测试中的工作原理,我认为您已经跳过了学习设计和如何处理mock的方法调用的一些基本知识。

温星华
2023-03-14

Mockito创建的模拟很“聪明”。当调用void方法时,它们不执行任何操作。当调用返回对象的方法时,它们返回null。当调用返回集合的方法时,它们返回一个空集合。

如果要验证GetAdminUser()DeleteUser()是否已调用,请使用mockito.verify()

这两件事在Mockito文档第1点和第2点中进行了解释。特别是:

默认情况下,对于所有返回值的方法,mock将返回null、空集合或适当的基元/基元包装值(例如:0、false、...for int/integer、boolean/boolean、...)。

 类似资料:
  • Mockito似乎是一个非常好的Java存根/模拟框架。唯一的问题是我找不到任何关于使用API的最佳方法的具体文档。测试中使用的常用方法包括: 当您在实践中看到Mockito的示例时,您会看到如下代码: 从我读过的所有文档中,我已经识别了几个Mockito“语法”的“模式”,这些“语法”是通过将这些方法调用像上面的示例一样链接在一起而获得的。我发现的一些常见模式有: 当/然后:当(你的方法())。

  • Mockito——我知道间谍在对象上调用实际方法,而模拟在双对象上调用方法。此外,除非有代码气味,否则要避免间谍。然而,间谍是如何工作的?我应该在什么时候使用他们?它们与模拟有什么不同?

  • 为什么Mockito会吞噬堆栈痕迹?例如,如果我有一个 和一个测试,例如 抛出的异常看起来总是 (这里提供的示例只是一个简化--我要处理更多的间接、类等等。我不能让Mockito吞噬部分模拟堆栈跟踪的关键部分……)

  • 试图将我的项目从Java 11更新到Java 17,在一个特定测试中,Mockito出现了一个意外错误。 投掷 不知道为什么Mockito这次考试不及格。

  • 现在,发生的事情似乎是,当field为0时,Mockito在第1行捕获对参数的引用。然后,在下一行中,该字段将增加到1,并一直保持到第3行,在第3行中进行验证。因此,Mockito错误地认为有两次调用,而第一次调用显然是 我如何指示Mockito正确地识别这种情况?

  • 测试类别 测试类别 详图搁置器 当我尝试模拟方法HistoryFromStrgyTable()的数据时,它实际上是在调用HistoryFromStrgyTable(),而不是从mockHistoryFromStrgyTable()获取数据。 我的测试用例在这一行失败了 谁能帮我一下吗。我不明白怎么了。我还将方法mockHistoryFromStrgyTable()从private更改为public