当前位置: 首页 > 知识库问答 >
问题:

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

鲜于凯康
2023-03-14

我是莫基托的新手。假设我有一节这样的课

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

共有3个答案

齐雅畅
2023-03-14

用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());
    }
}
嵇浩淼
2023-03-14

你可以使用间谍进行部分模拟(参见此处了解如何实现)。

但和往常一样:当人们开始考虑使用模拟框架的复杂方法时,真正的答案是:后退一步,改进生产代码。构造器应该只做简单的初始化操作。

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

你仍然可以这样做:

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

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

现在,您的单元测试可以很高兴地使用接受两个参数的ctor——您对模拟任何东西的需求完全消失了。

柯默
2023-03-14

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

在您的测试中创建一个MyClass实例,其中包含重写的Draw()方法:

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

// Now test your class as you want
 类似资料:
  • 我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 问题内容: 我试图在此模块中找到一种模拟Redis的方法: 使用以下测试代码: 我还尝试了一些变体,但由于基本需要模拟构造函数,因此我有点受阻,我不确定Sinon是否支持这一点? 不知道在这里还有什么尝试,我也尝试按照这里的建议使用rewire,但是从不设置该私有变量。 我想最终伪造我的错误路径。 我很想听听其他人在测试Node js中的Redis所做的事情。 问题答案: 您的问题不是Sinon是

  • 为了测试一些遗留代码,我必须使用powermockito。原因是遗留代码没有使用依赖项注入,并且由于某些原因,我们现在无法重构代码。我们正在系统中使用ANT运行testng。我已经配置了构建。xml使用power mock和power mock testng库。我想用powermockito模拟一个构造函数,下面是示例代码。 这次测试失败了,我不知道这里出了什么问题。我还看到下面的链接配置测试与电

  • 我试图模拟一个有嵌套类的类。那个嵌套类有一个构造函数参数。当我试图使用mockito而不是mockito测试时,实际的方法正在执行。 我在外部类上做了@injectmock,在内部类上做了@Mock。 我像往常一样尝试使用@Mock调用类,但是实际的方法eth1()正在被访问。 需要模拟内部ClassB方法,而不是访问真实方法。 作为mockito的初学者,我试图澄清这一点。但在访问void方法等