在类的构造函数中模拟一个方法

时间:2017-09-26 19:22:04

标签: java junit constructor mockito

我是mockito的新手。假设我有一个这样的课程

public class MyClass {
    int a;
    String b;
    public MyClass(int a) {
        this.a = a;
        this.b = draw();
        System.out.println("class is created");
    }

    public String draw() {
        System.out.println("my");
        return "b";
    }

    public void apple() {
        System.out.println("apple");
    }
}

我正在使用Mockito编写JUnit测试,我正在使用构造函数创建类的对象。我在设置类时是否可以模拟draw()方法?

3 个答案:

答案 0 :(得分:2)

不清楚为什么你需要Mockito。这是一个没有Mockito的解决方案。

在您的测试中,使用重写的MyClass方法创建draw()的实例:

final MyClass myClass = new MyClass() {
    @Override
    public String draw() {
        return "mock data";
    }
}

// Now test your class as you want

答案 1 :(得分:1)

你可以使用间谍来做部分模拟(参见here了解如何做到这一点)。

但是像往常一样:当人们开始考虑使用模拟框架的复杂方法时,真正的答案是:退一步并改进您的生产代码。你的构造函数应该只进行 简单的初始化。

在你的情况下,一种合理的方法是:不要调用内部方法来计算该字段的值 - 但将>值传递给构造函数(换句话说 - 使用依赖注入)。

你仍然可以做类似的事情:

public MyClass(int a) {
  this(a, draw());
}

MyClass(int a, String b) { 
  this.a = a; ...

现在你的单元测试可以愉快地使用那个带有两个参数的ctor - 你需要模拟完全消失。

答案 2 :(得分:0)

使用 Mockito 测试课程的一种方法是,

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

public class TestMyClass {

    @Mock
    private MyClass clazz;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testDraw() {
        when(clazz.draw()).thenReturn("My mock hello");
        assertEquals("My mock hello", clazz.draw());
    }
}