繁体   English   中英

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

[英]Mock a method inside a constructor of a class

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

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 测试,我正在使用构造函数创建 class 的 object。 当我安装 class 时是否可以模拟 draw() 方法?

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

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

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

// Now test your class as you want

您可以转向使用间谍进行部分模拟 (有关方法,请参见此处 )。

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

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

而且您仍然可以执行以下操作:

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

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

现在,您的单元测试可以愉快地使用带有两个参数的ctor-并且完全无需模拟任何东西。

使用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());
    }
}

作为给定解决方案的补充,构造函数还可以接收模拟为 function 的方法。

import java.util.function.Supplier;
    
public class MyClass {
    int a;
    String b;

    public MyClass(int a, Supplier<String> draw) {
        this.a = a;
        this.b = draw==null? draw() : draw.get();
        System.out.println("class is created");
     }
        
    public String draw() {
        System.out.println("my");
        return "b";
    }
        
    public void apple() {
         System.out.println("apple");
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM