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)
如果您使用的是 spring,您也可以使用 spring-test。
import org.springframework.test.util.ReflectionTestUtils;
ReflectionTestUtils.setField(notificationService, "timeToLive", 90L);
Run Code Online (Sandbox Code Playgroud)