首页 > 解决方案 > 尝试使用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");}
}

谁能告诉我我的测试用例出了什么问题?当我访问公共方法时,相同的模拟对象正在工作。

我只有私有方法有问题。

我该如何解决这个问题?

标签: javajunitmocking

解决方案


您应该避免一些测试气味。

  • 您应该测试对象的行为而不是它们的实现细节。私有方法是实现细节,因此可能会改变
  • 测试不应该使用反射。反射取决于对象的实现细节,这使得测试变得脆弱
  • 代码覆盖率不应该是测试的目标。当指标成为目标时,它就不再是一个好的指标

那你应该怎么测试呢?

MockClass通过 public 方法模拟你的和测试。如果编写这样的测试过于笨拙、脆弱或不可能,你应该重新考虑你的设计。


推荐阅读