为了账号安全,请及时绑定邮箱和手机立即绑定

如何将模拟注入私有方法?

如何将模拟注入私有方法?

慕尼黑8549860 2022-08-03 10:27:29
模拟对象在我访问公共方法时工作正常。但是当我访问私有方法时它不起作用。我的模拟课:@componentpublic class Test{public List<String> list(){ // some function}}我的主类:@componentpublic class Test2{private string method(String method){//here where i have to use mock object//some function}}我的测试用例:public class JunitTestCases{@MockTest test;@Autowired@InjectMocksTest2 test2public void Oncall{Test2 test=new Test2();Method method=Test2.class.getDeclaredMethod("method",String.class);method.setAccessible(true);method.invoke(test, "data");}}我得到以下错误。java.lang.reflect.InvocationTargetExceptionat 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)任何建议?我怎样才能让它工作?
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

在调用方法中,你使用字符串.class[paramter]而不是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");


    }

}


查看完整回答
反对 回复 2022-08-03
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

用于编写测试的演示类


public class PowerMockDemo {


    public Point callPrivateMethod() {

        return privateMethod(new Point(1, 1));

    }


    private Point privateMethod(Point point) {

        return new Point(point.getX() + 1, point.getY() + 1);

    }

}

演示类 的测试类


@RunWith(PowerMockRunner.class)

@PrepareForTest(PowerMockDemo.class)

public class PowerMockDemoTest {


    private PowerMockDemo powerMockDemoSpy;


    @Before

    public void setUp() {

        powerMockDemoSpy = PowerMockito.spy(new PowerMockDemo());

    }


    @Test

    public void testMockPrivateMethod() throws Exception {

        Point mockPoint = mock(Point.class);


        PowerMockito.doReturn(mockPoint)

            .when(powerMockDemoSpy, "privateMethod", anyObject());


        Point actualMockPoint = powerMockDemoSpy.callPrivateMethod();


        assertThat(actualMockPoint, is(mockPoint));

    }

}


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信