我试着用Mockito测试一个单例类,像这样:
public class Single {
private ID id;
private Single(){} //private constructor
public static Single getSingle(){ // ***code to get instance*** }
// method I want to test
public String getName(){
String name = id.getRawName(); // need field id here
** additional operations on name ** // code need to be tested
return name;
}
}
我试着模拟这个类,用反射设置字段"id",像这样:
Single sg = Mockito.mock(Sincle.class);
Field myID = sg.getClass().getDeclaredField("id"); // fails here
myID.setAccessible(true);
myID.set(sg, <ID instance>);
但是getDeclaredField()
方法失败,除了
. lang。NoSuchFieldException: id
我猜这是因为id
字段是null
实例sg。
所以我想知道是否有什么我可以做的测试这个方法不修改原始类?
mock不是真正的对象。您不能设置mock的声明字段,因为它不存在1!
在编写测试时,您通常希望模拟所有而不是的类:
-
被测系统(在本例中为
Single
)类 - 数据结构(如
List
)和其他pojo。
因此,你真正想要嘲笑的是ExternalCall
,你没有真正解释它在你的问题中是如何工作的。但是,如果它是静态方法,则需要使用PowerMock
。参见:用Mockito模拟静态方法
注意你的错误是NoSuchFieldException
,因为你实际上没有一个真实的实例。它是而不是,因为:
我猜这是因为
id
字段是null
实例sg。
这是因为字段实际上不存在1在mockit生成的子类中,而不是因为它是null
。
1:它确实存在于mock的超类中(在本例中为Single
),但是它的值被模拟行为捕获,除非将其用作部分模拟,否则将被忽略。但是,这是一个技术细节,与Mockito的正确使用无关。
…我可以做些什么来测试这个方法而不修改原始类?
是的,有。使用Mockito作为基本用途:
when(sg.getId()).thenReturn("123")