java - 尝试使用junit中的反射访问私有方法时,模拟对象不起作用
问题描述
当我尝试使用反射访问私有方法时,模拟对象不起作用
主类:
@Component
public class ActualClass{
@Autowired
MockClass data;
private String sampleMethod(String data){
//
List<String> list=data.getdata("something") // trying to mock this line
//}
}
模拟类:
@Component
public class MockClass{
public List<String> getdata(String serviceName){
return restTemplate.getForObject("http://localhost:9000/data/something",
ArrayList.class); this line will return some datas as list}
}
我的测试用例:
public class TestCases{
@Autowired
MockClass mockobj;
@Autowired
@InjectedMocks
ActualClass actualClass
@Test
public void valid(){
MockitoAnnotations.initMocks(this);
List<String> obj=new ArrayList<String>();
obj.add("something")
when(mockobj.getdata("something")).thenreturn(obj);
Class<?> cObject=Class.forName("com.ActualClass");
ActualClass actualClass=(ActualClass) cObject.newInstance();
Method method=cObject.getDeclaredMethod("sampleMethod",String.class);
method.setAccessible(true);
method.invoke(actualClass,"date");}
}
谁能告诉我我的测试用例出了什么问题?当我访问公共方法时,相同的模拟对象正在工作。
我只有私有方法有问题。
我该如何解决这个问题?
解决方案
您应该避免一些测试气味。
- 您应该测试对象的行为而不是它们的实现细节。私有方法是实现细节,因此可能会改变
- 测试不应该使用反射。反射取决于对象的实现细节,这使得测试变得脆弱
- 代码覆盖率不应该是测试的目标。当指标成为目标时,它就不再是一个好的指标
那你应该怎么测试呢?
MockClass
通过 public 方法模拟你的和测试。如果编写这样的测试过于笨拙、脆弱或不可能,你应该重新考虑你的设计。
推荐阅读
- azure-data-factory - Azure 数据工厂 - 每个内部活动都失败
- swift - document.body.scrollHeight 不能在 swift 中与 Ipad 一起使用
- python - 在 Windows 10 后台运行 python 脚本
- android - 底部导航未根据默认语言更新
- python - 排序后如何从列表的块中获取元素的原始位置?
- c# - WPF ListBox SelectedIndex 与分组
- python - 运行芹菜任务时如何取消确认消息?
- c - Insert and delete node from hash table in C
- pytorch - CUDA Illegal Memory Access on PyTorch 1.3
- ubuntu-18.04 - 更新大量文件时,Samba 共享文件夹变得无响应(使用 repo sync 命令)