java - 为什么反射 api 在测试用例中不起作用
问题描述
我正在尝试使用 java 反射 api 从我的测试类中访问主类变量,但是我遇到了如下异常,有人可以指导我吗
主班
package com.example.microservice.controller;
public class PrivateStatic {
public void process() {
String message = "data";
if (message != null && message.equalsIgnoreCase("data")) {
System.out.println("print message"+message);
} else {
System.out.println("empty message"+message);
}
}
}
测试班
package com.example.microservice.controller;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class PrivateStaticTest {
@InjectMocks
PrivateStatic private_Static;
@Test
public void processTest() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
final java.lang.reflect.Field field = private_Static.getClass().getDeclaredField("message");
final boolean origionalValue = field.isAccessible();
field.setAccessible(true);
field.set(private_Static, "data");
field.setAccessible(origionalValue);
private_Static.process();
}
}
例外
java.lang.NoSuchFieldException: message
at java.lang.Class.getDeclaredField(Class.java:2070)
at com.example.microservice.controller.PrivateStaticTest.processTest(PrivateStaticTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
解决方案
public class PrivateStatic {
private String message = "data";
public void process() {
if (message != null && message.equalsIgnoreCase("data")) {
System.out.println("print message"+message);
} else {
System.out.println("empty message"+message);
}
}
}
将“消息”作为类字段也可以使用ReflectionTestUtils.setField(private_Static, "message", "data");
推荐阅读
- datetime - 如何在 Julia 中将毫秒数组转换为 MM:SS:ss 格式或 DateTime 格式?
- sql - 如何使用 SQL 中的节点读取 XML 文件中的属性
- node.js - MongoDB如何使用id和更新值更新对象数组
- google-cloud-data-fusion - 关于google数据融合的一些问题
- postgresql - 在 PostgreSQL/PostGIS 中的多边形交叉点内查找点
- reactjs - 如何使用保存在本地存储中的先前创建的表单填充表单并在 React 中对其进行编辑
- java - 如何在对象中搜索数据并转换为列表
- python-3.x - 如何修复在 CMD get 的 DLL 错误中启动的 Python 脚本,但在 Pycharm 和 Anaconda Comand Promt 中运行
- php - Smarty 的审计日志模块
- r - 操纵绘图网格中某些绘图之间的边距