[英]Access a private field for a junit test
我試圖從一個類初始化一個私有字段,以便對其方法進行單元測試。 為此,我正在使用反射,但我總是收到 IllegalArgumentException 並且我不明白我做錯了什么。
我的代碼看起來像這樣:
public class MyClass {
private BufferedReader reader;
public void methodToTest(){
doSomethingwith(reader);
}
}
public class testClass {
@Test
public void testMethod() {
Field reader = MyClass.class.getDeclaredField("reader");
reader.setAccessible(true);
StringReader stringReader = new StringReader("some string");
BufferedReader readerToSet = new BufferedReader(stringReader);
reader.set(readerToSet, readerToSet);
MyClass instance = new MyClass();
instance.methodToTest();
}
}
當我嘗試運行測試時出現此錯誤:
Can not set java.io.BufferedReader field MyClass.receiveReader to java.io.BufferedReader
我還嘗試從類中獲取字段的值並將其設置給讀者。 但是該值返回 null 並且我仍然收到相同的錯誤消息。
知道如何初始化該字段以便我可以測試該方法嗎?
您必須先實例化對象,然后才能設置其字段! (並且您拼錯了 BufferedReader 參考。)
Field reader = MyClass.class.getDeclaredField("reader");
reader.setAccessible(true);
MyClass mc = new MyClass();
StringReader stringReader = new StringReader("some string");
BufferedReader readerToSet = new BufferedReader(stringReader);
reader.set(mc, readerToSet);
mc.methodToTest();
如果您使用的是 spring,您也可以使用 spring-test。
import org.springframework.test.util.ReflectionTestUtils;
ReflectionTestUtils.setField(notificationService, "timeToLive", 90L);
你可以使用 Mockito (org.mockito.internal.util.reflection.Whitebox)
Whitebox.setInternalState(object, "fieldName", fieldValue);
使用 apache.commons.lang3
import org.apache.commons.lang3.reflect.FieldUtils;
FieldUtils.writeField(myObject, "anyProperty", 420/*any value*/, true);
FieldUtils.readField(myObject, "anyProperty", true);
@kocko 的回答在大多數情況下是正確的。 但是如果你不想顯示實現細節,你可以不為你的字段設置訪問級別修飾符( default
訪問級別)。
因此,在您的情況下,字段聲明應如下所示:
public class MyClass {
BufferedReader reader;
...
}
然后確保您的測試與您的代碼位於同一包中,但位於test
目錄中。 如果一切順利,您將無需任何黑客即可訪問它。
注意: default
訪問級別意味着該事物僅在類和包內可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.