使用Mockito模拟方法

Tar*_*mar 1 unit-testing mockito

使用mockito模拟方法可以确保永远不会调用mocked方法吗?我有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*ker 8

已编辑 因为您没有提供行为check1(). 所有方法都被模拟,因此,如果没有提供行为,则check1()返回int的返回类型的默认值,即0.此外,check1()因为它被模拟甚至无法调用modify().

如果您正在尝试测试一个类,那么您永远不会模拟测试类.在极少数情况下,您可能需要Spy正在测试的课程.相反,你只是模仿合作者.

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

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