我有以下类
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
实例声明为mock,则setTheName
的主体将不再是您在TheClass
中定义的主体,而是返回null
的存根方法。这是因为你没有"训练"setTheName
有任何行为。
实际上,被嘲笑的实例看起来就像是这样声明的:
public class TheClass {
public String name = null;
public void setTheName(){
// do nothing
}
public String getNamesFromDB(){
return "dbName";
}
}
你犯了一个基本的Mockito错误:你在嘲笑测试中的系统。