单元测试学习2.0+修改私有属性
Jmockit解决@Qualifier和@Resource出现 Missing @Injectable报错_missing injectable for field com guosen. zebra gol-CSDN博客
Jmockit对@Value属性进行模拟_mock value-CSDN博客
(2)修改私有属性:Deencapsulation.setField
@Tested
private OrderServiceImpl orderService;
@Test
public void mockPrivateName_test() {
// 修改被测试类中的成员属性name
Deencapsulation.setField(orderService, "name", "codeMock");
String stringName = orderService.getStringName();
Assert.assertEquals("codeMock", stringName);
}
-
作用:
使用 JMockit 的Deencapsulation
工具直接修改被测试类的私有属性name
。- 不需要通过反射手动获取和设置属性。
- 适合测试一些依赖外部配置或框架注入的私有属性。
-
为什么修改私有属性?
- 在实际运行中,
name
的值来源于@Value("${order.name}")
,但在测试环境中通常不会加载真实配置文件。 - 因此,通过
Deencapsulation.setField
修改属性值,可以模拟配置文件加载的效果。
- 在实际运行中,
拓展(接之前的文章):
为什么 orderService
用 @Tested
,userService
用 @Injectable
?
原因1:测试目标的不同
-
orderService
是测试的核心对象:- 它是测试中需要调用的方法所属的类,直接标注为
@Tested
,表示这是测试的目标类。 - JMockit 会自动实例化它,并注入依赖。
- 它是测试中需要调用的方法所属的类,直接标注为
-
userService
是被测试类的依赖:- 它只是
orderService
的一个成员,用于辅助orderService
完成业务逻辑。 - 标注为
@Injectable
后,你可以控制其行为,避免依赖真实实现。
- 它只是