mockito 在类的构造函数内模拟方法

qij5mzcb  于 2023-01-30  发布在  其他
关注(0)|答案(4)|浏览(196)

我是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()方法?

bq8i3lrv

bq8i3lrv1#

不清楚为什么这里需要Mockito。这是一个没有Mockito的解决方案。
在测试中,使用重写的draw()方法创建MyClass示例:

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

// Now test your class as you want
ddrv8njm

ddrv8njm2#

您可以使用spies来执行 * 部分模拟 *(参见here了解如何执行此操作)。
但和往常一样:当人们开始考虑使用模拟框架的复杂方法时,真实的的答案是:退一步改进你的产品代码。2你的构造函数应该 * 只 * 做简单的初始化工作。
在您的情况下,一个合理的方法是:不要调用内部方法来计算该字段的值-而是将该值传递给构造函数(换句话说-使用依赖注入)。
你仍然可以做这样的事情:

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

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

现在,您的单元测试可以愉快地使用接受 * 两个 * 参数的ctor--您完全不需要模拟任何东西。

czq61nw1

czq61nw13#

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

hmtdttj44#

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

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");
     }
}

相关问题