unit-testing - 使用 Mockito 模拟一个方法

标签 unit-testing mockito

使用 mockito 模拟方法是否确保永远不会调用模拟方法?我有 Main 类,其中包含一些我想为其编写单元测试的代码,并且我有一个单元测试类 MainTest,其中包含 Main 类的单元测试。

例如:

源类:

package abc;

public class Main {

    public int check1() {
        int num = 10;
        num = modify(num);
        return num;
    }

    public int modify(int num) {
        if (num % 10 == 0) return num / 10;
        return -1;
    }
}

Junit 测试(使用 mockito)

package abc;

import junit.framework.Assert;

import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;

public class MainTest {

    private static Main main;

    @BeforeClass
    public static void setUp() {
        main = Mockito.mock(Main.class);
        Mockito.when(main.modify(10)).thenReturn(5);
    }

    @Test
    public void testCheck1() {
        Test1 main1 = new Main();
        int num = main.check1();
        Assert.assertEquals(5, num);
    }
}

这个测试失败了。为什么?

最佳答案

已编辑 因为您没有为 check1() 提供行为。 所有 方法都会被模拟,因此无需您提供行为,check1() 会为 int 的返回类型返回一个默认值,即 0。此外,check1 () 因为它是模拟的,所以甚至无法调用 modify()

如果你正在尝试测试一个类,你永远不会模拟被测类。在极少数情况下,您可能不得不监视一个正在测试的类。相反,您只会模拟合作者。

我猜你的例子是人为的(我希望如此)。但是,如果您正在编写和测试一个您认为要修改某些内部方法行为的类,我看到两种可能的可能性:

  1. 您可能需要将要模拟的方法的功能重构到协作者类中。然后作为合作者继续 mock 这种行为是有意义的。
  2. 您可能还需要修改 API,以便传递要更改的内容。在您的情况下,check1() 硬编码它传递给 modify() 的值,这就是您尝试模拟 modify() 的原因>。相反,如果该值是 check1() 的参数或类 Main 中的可设置字段,则根本不需要使用模拟。

关于unit-testing - 使用 Mockito 模拟一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801133/

相关文章:

c# - 使用 Effort 和 TypeName 属性进行测试

android - 使用 Robolectric 测试菜单

java - 私有(private)方法的 Junit 测试用例

unit-testing - 未注入(inject)模拟对象

java - 无法从模拟组件类调用函数

c# - 单元测试序列化有什么意义吗?

c# - 如何在单元测试中实现 EF 的 FIND 方法?

c++ - 如何使用 resharper 在 QNX 虚拟机中运行 Google 测试(C++ 单元测试)?

java - 静态模拟不起作用

Spring - 禁用特定 Bean 的 Autoproxy