我有以下类(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/