簡體   English   中英

訪問用於 junit 測試的私有字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM