一尘不染

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

java

我最近已经问了几个有关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有可能吗?

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


阅读 182

收藏
2020-12-03

共1个答案

一尘不染

您正在将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

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

2020-12-03