-2
如果要測試的類的某些公共方法使用私有字段,那麼我們可以在JUnit測試方法中嘲笑該私有字段嗎? 否則,如果您不能訪問專用字段,則不能使用或修改其值,並將其傳遞給JUnit測試以查看不同的結果。我們可以模擬JUnit測試的類的私有字段嗎?
如果要測試的類的某些公共方法使用私有字段,那麼我們可以在JUnit測試方法中嘲笑該私有字段嗎? 否則,如果您不能訪問專用字段,則不能使用或修改其值,並將其傳遞給JUnit測試以查看不同的結果。我們可以模擬JUnit測試的類的私有字段嗎?
使用反射(以下示例不是JUnit測試,但它的工作原理完全相同)。
示例類private
變量和print()
確保set
成功的方法。
public class stackoverflow2 {
private int testPrivate = 10;
public void print(){
System.out.println(testPrivate);
}
}
調用類使用反射和get
和set
方法。請注意,設置testPrivateReflection
不會更改testPrivate
,因爲它是值的本地副本,因此我們使用set
。
public class stackoverflow {
public static void main(String[] args) throws IllegalArgumentException,
IllegalAccessException, NoSuchFieldException {
stackoverflow2 sf2 = new stackoverflow2();
Field f = sf2.getClass().getDeclaredField("testPrivate");
f.setAccessible(true);
int testPrivateReflection = (int)f.get(sf2);
System.out.println(testPrivateReflection);
f.set(sf2, 15);
sf2.print();
}
}
yo0u表示「模擬私人領域」是什麼意思?你的意思是「設置一個私人領域是一個模擬嗎?」所以你有A類,有一個B類作爲一個領域,你想嘲笑?你可以使用'ReflectionTestUtils'(從spring)將值注入私人領域,如果這是你正在尋找。如果該字段是原始值,則不可能「嘲笑」該字段。 – BretC
無論如何,你應該測試接口而不是實現。 –
是的,我剛剛讀了關於Mockito的地方。這個ReflectionTestUtils與Mockito相同嗎? –