当前位置: 首页 > 面试题库 >

使用Mockito存根并执行测试方法

呼延化
2023-03-14
问题内容

我最近已经问了几个有关jUnit和Mockito的问题,但我仍然很努力地把握住这个问题。这些教程都是针对非常简单的示例的,因此我正在努力扩大测试用例以适合我的课程。

我目前正在尝试为Webapp中我的一个代理中的方法编写一些测试用例。该方法与代理内部的其他两种方法交互以验证某些对象。我现在只想测试这种方法。

这是我尝试做的事情:

  1. 创建我的代理的Mockito对象,如下所示:

MyProcessingAgent mockMyAgent = Mockito.mock(MyProcessingAgent.class);

  1. 使用Mockito设置存根(希望是正确的术语),如下所示:

Mockito.when(mockMyAgent.otherMethod(Mockito.any(arg1)).thenReturn(requiredReturnArg);

  1. 尝试像这样执行我的方法:

List myReturnValue = mockMyAgent.methodThatNeedsTestCase();

我原本希望在中进行操作myReturnValue,但是却收到0,因此我尝试调试。当我调用该方法时,它永远不会执行。我在方法的第一行有一个调试点,它永远不会被触碰。

如果我想在一个类的一个方法中执行代码,但要强制该类中的其他方法(一个试图与外部数据库交互的方法)返回伪造的值。Mockito有可能吗?

看来我目前的方法不是正确的测试风格,但是我不确定该如何前进。我可以模拟我的类并让一个方法像普通方法一样执行,而其他方法却被存根以返回给定的值,这样我就不必在测试该方法时处理数据访问了吗?


问题答案:

您正在将a Mock与混淆Spy

在模拟中, 所有方法 都存根并返回“智能返回类型”。这意味着,除非指定行为,否则在模拟类上调用任何方法都不会 执行任何操作

在间谍中,该类的原始功能仍然存在,但是您可以在间谍中验证方法调用,也可以覆盖方法行为。

你想要的是

MyProcessingAgent mockMyAgent = Mockito.spy(MyProcessingAgent.class);

一个简单的例子:

static class TestClass {

    public String getThing() {
        return "Thing";
    }

    public String getOtherThing() {
        return getThing();
    }
}

public static void main(String[] args) {
    final TestClass testClass = Mockito.spy(new TestClass());
    Mockito.when(testClass.getThing()).thenReturn("Some Other thing");
    System.out.println(testClass.getOtherThing());
}

输出为:

Some Other thing

注意:您应该真正尝试模拟正在测试的类的依赖关系,而 不是 类本身。



 类似资料:
  • 我最近问了几个面向jUnit和Mockito的问题,但我仍然很难掌握其中的诀窍。这些教程都是针对非常简单的示例,所以我很难扩展我的测试用例来为我的类工作。 我目前正试图为我在WebApp中的一个代理中的一个方法编写一些测试用例。该方法与代理内部的几个其他方法交互,以验证某些对象。我现在只想测试一下这个方法。 使用Mockito设置存根(希望是正确的术语)。如下所示: 尝试执行我的方法,如下所示:

  • 我使用testNg用于使用java的自动化,我使用从excel获取数据并作为参数传递给测试脚本。 假设我在中有10行数据,我的测试用例将按顺序执行10次,但现在我想并行运行这10个测试,同时使用线程。 这能做到吗?如果是的话,有人能给我一个同样的例子吗?

  • 我试图通过在传入字符串“John”时返回一个用户对象来建立类(spring-data-jpa存储库)的方法。 发生的情况是,在userService中,当调用users.findbyUsername(“John”)时,它总是返回null,而不是我定义的任何用户对象: 当我在测试方法中放置断点并比较users和UserService.users时,它们是相等的。 pom版本

  • 我一个类有5到6个方法,想在不同的节点上并行运行方法,我有网格2设置,里面有4个节点。 下面是我的测试。xml 我有一个测试工具,它初始化了login、common和utils类 在我的测试类中,我扩展了测试工具,在@Beforemethod中,我调用了inilze方法 如果我运行测试,我会看到以下问题 两个浏览器在每个节点中打开一个,但只有一个浏览器启动应用程序,另一个不启动。 如果我遗漏了什么

  • 我正在尝试运行一个使用Mockito的JUnit cucumber测试。这是我遇到的问题。在我的cucumber赛跑课上,我有 在我的常规JUnit测试中 鉴于我一次只能有一个@RunWith,我如何将Mockito与cucumber结合使用呢?

  • 我使用JUnit4和Mockito创建了一个Spring Boot2应用程序。当我测试某种方法时。会出现这样的例外: 这是我的测试代码 SuveryService.java SurveyRepository.java 我引用了这篇文章Mockito NullPointerException,但这个问题仍然存在。任何帮助都将被应用。