java - 使用 Mockito 时实例变量保持为 null

标签 java junit mockito

我有以下类(class)

package pckt.theclass;

public class TheClass {

    public String name = "testing";

    public void setTheName(){
        this.name = getNamesFromDB();
    }

    public String getNamesFromDB(){
        return "pablo";
    }

}

这是它的测试类

package pckt.theclass;

import org.junit.*;
import org.mockito.Mockito;


public class TheClassTest {

    @Test
    public void testSetTheName() {

        //TheClass tc = Mockito.mock(TheClass.class);
        //Mockito.when(tc.getNamesFromDB()).thenReturn("dbName");
        TheClass tc = new TheClass();
        tc.setTheName();
        System.out.println("Name: "+tc.name);
        Assert.assertEquals("pablo", tc.name);
    }
}

如果我按原样运行测试类,它就会通过。但是,如果我取消注释 Mockito 行并修改assertEquals 以期望“dbName”,则测试失败并出现错误

expectend "dbName" but was <null>

问题是因为实例变量“name”由于某种原因没有被填充,即使它的声明中已经有一个值。我是 Mockito 的新手,所以我不确定是否需要做一些事情才能使其正常工作。

想法?

最佳答案

这是因为,如果您将 TheClass tc 实例声明为模拟,则 setTheName 的主体不再是您在 TheClass 中定义的主体>,而是一个返回 null 的 stub 方法。这是因为您没有“训练”setTheName 以产生任何行为。

实际上,模拟实例看起来就像这样声明的:

public class TheClass {
    public String name = null;

    public void setTheName(){
        // do nothing
    }

    public String getNamesFromDB(){
        return "dbName";
    }
}

您犯了 Mockito 的基本错误之一:您正在模拟被测试的系统。

关于java - 使用 Mockito 时实例变量保持为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445693/

相关文章:

java - 使用 Java/Mockito/PowerMockito 实例化具有私有(private)构造函数的类

java - 尝试解密指纹 API 密码时出现 BadPaddingException

java - okhttp 不允许设置 content-type

java - Android 测试框架说明

Spring Boot 5 多个 JUnit JPA 测试文件接线

java - Mockito 验证构造函数调用方法

Java 字节数组到字符串到字节数组

java - 用另一个表中的金额总和减去一个表中的金额总和

java - Mockito 失败的基本示例

java - Mockito:模拟包含 lambda 表达式的方法调用