java - 使用 Mockito stub 并执行测试方法

标签 java junit mocking mockito

我最近问了几个面向 jUnit 和 Mockito 的问题,但我仍然很难掌握它的窍门。这些教程都是针对非常简单的示例,所以我正在努力扩大我的测试用例以适用于我的类(class)。

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

这是我尝试做的:

  1. 像这样创建我的代理的 Mockito 对象:

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

  2. 使用 Mockito.when 设置 stub (希望是正确的术语),如下所示:

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

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

    List myReturnValue = mockMyAgent.methodThatNeedsTestCase();

我期待 myReturnValue 中的内容,但收到 0,所以我尝试调试。当我调用该方法时,它永远不会执行。我在方法的第一行有一个永远不会被触及的调试点。

如果我想在类的一个方法中执行代码,但强制类中的其他方法(尝试与外部世界中的数据库交互的方法)返回伪造的值。 Mockito 可以做到这一点吗?

看来我目前的方法不是正确的测试风格,但我不确定如何继续前进。我可以模拟我的类并让一个方法像平常一样执行,而其他方法被 stub 以返回我的给定值,这样我就不必在测试这个方法期间处理数据访问?

最佳答案

您将 MockSpy 混淆了。

在模拟中,所有方法都被 stub 并返回“智能返回类型”。这意味着调用模拟类的任何方法什么都不做,除非你指定行为。

在 spy 中,类的原始功能仍然存在,但您可以在 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

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

关于java - 使用 Mockito stub 并执行测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976008/

相关文章:

java - 我可以更新现有的 Amazon S3 对象吗?

java - HTTPServletRequest getServerPort 返回 -1

java - (j)单元测试断言和错误消息?

javascript - 使用 jsdom 更改 HTML 标签

python - 如何模拟/修补整个类(class)?

c# - 如何模拟类中依赖的两种方法

java - 如何将对象从 Spring 3.0 Controller 传递到 JSP View 并使用 JSTL 进行测试

java - 不调整窗口大小不显示内容

spring - 如何将属性传递给 spring junit 测试配置

java - @After ,@before 不在测试用例中工作