访问用于 junit 测试的私有字段

sch*_*ona 4 java reflection unit-testing field

我试图从一个类初始化一个私有字段,以便对其方法进行单元测试。为此,我正在使用反射,但我总是收到 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行测试时出现此错误:

Can not set java.io.BufferedReader field MyClass.receiveReader to java.io.BufferedReader
Run Code Online (Sandbox Code Playgroud)

我还尝试从类中获取字段的值并将其设置给读者。但是该值返回 null 并且我仍然收到相同的错误消息。

知道如何初始化该字段以便我可以测试该方法吗?

lau*_*une 14

您必须先实例化对象,然后才能设置其字段!(并且您拼错了 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();
Run Code Online (Sandbox Code Playgroud)


小智 13

使用 apache.commons.lang3

import org.apache.commons.lang3.reflect.FieldUtils;

FieldUtils.writeField(myObject, "anyProperty", 420/*any value*/, true);

FieldUtils.readField(myObject, "anyProperty", true);
Run Code Online (Sandbox Code Playgroud)


Jos*_*tha 8

如果您使用的是 spring,您也可以使用 spring-test。

import org.springframework.test.util.ReflectionTestUtils;

ReflectionTestUtils.setField(notificationService, "timeToLive", 90L);
Run Code Online (Sandbox Code Playgroud)