如何将模拟注入私有方法? [英] how to inject mock into private method?
本文介绍了如何将模拟注入私有方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当我访问公共方法时,模拟对象运行良好.但是当我访问私有方法时,它不起作用.
the mock object is working fine when i access public methods. but it s not working when i access private method.
我的模拟课程:
@component
public class Test{
public List<String> list(){
// some function}
}
我的主班:
@component
public class Test2{
private string method(String method){
//here where i have to use mock object
//some function
}
}
我的测试案例:
public class JunitTestCases{
@Mock
Test test;
@Autowired
@InjectMocks
Test2 test2
public void Oncall{
Test2 test=new Test2();
Method method=Test2.class.getDeclaredMethod("method",String.class);
method.setAccessible(true);
method.invoke(test, "data");}
}
我遇到以下错误.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.TestCases.method(TestClass.java:198)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.MainClass.validate(MainClass.java:149)
... 21 more
有什么建议吗?我该如何运作?
any suggestion? how can i make it work?
推荐答案
在调用方法中,您使用 string.class [paramter] 而不是 Class [ ] [parameterArray].
in the invoke method your using string.class[paramter] instead of Class[][parameterArray].
无需为Test2.class创建另一个对象,您已经使用过的@injectMocks只需在invoke方法中使用变量即可..
public class JunitTestCases{
@Mock
Test test;
@InjectMocks
Test2 test2;
@Test
public void Oncall{
MockitoAnnotations.initMocks(this);
Class<?>[] params = new Class<?>[]{String.class};
Method method=Test2.class.getDeclaredMethod("method",params);
method.setAccessible(true);
method.invoke(test2, "data");
}
}
这篇关于如何将模拟注入私有方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文