单元测试整理

本文介绍了如何在单元测试中对私有字段、私有方法和静态方法进行Mock操作。通过使用PowerMockRunner、MemberModifier、反射以及工具类如ReflectionUtil,展示了设置私有字段、模拟私有方法和静态方法的多种方式。同时,解释了@InjectMocks、@Mock和@Spy注解的区别和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 私有/静态字段的mock

@RunWith(PowerMockRunner.class)

@PrepareForTest({ DataProjectServiceImpl.class })

MemberModifier.field(DataProjectServiceImpl.class, "fieldName").set(

        dataProjectServiceImpl , "public test");

私有字段通过反射的方式

private void setPrivateFiled(Object object, String fieldName, String fieldValue) throws Exception {

    Field f = object.getClass().getDeclaredField(fieldName);

    f.setAccessible(true);

    f.set(object, fieldValue);

}

setPrivateFiled(impl, "clientId", "adcApp");

setPrivateFiled(impl, “xx”, “lll”);

或者直接使用工具类:ReflectionUtil.setPrivateField(antcOperator, "jobClient", jobClient);

  • 私有方法的mock(或者用反射)

@RunWith(PowerMockRunner.class)

@PrepareForTest({ DataProjectServiceImpl.class })

MemberModifier.stub(MemberMatcher.method(DataProjectServiceImpl.class, "isTenantAdmin"))

        .toReturn(true);

反射:

Method method = CapSessionServiceImpl.class.getDeclaredMethod("isAllow", String.class);

method.setAccessible(true);

Object ret = method.invoke(capSessionService, "mock_app");

//多参数传参

//Object ret = method.invoke(bucBumngLoginFilter, new Object[] {request, response});

  • 静态方法的mock

@RunWith(PowerMockRunner.class)

@PrepareForTest({ AlipaySsoUtil.class })

LoginUser loginUser = new LoginUser();

loginUser.setOutUsrNo("75654");

PowerMockito.mockStatic(AlipaySsoUtil.class); 

PowerMockito.when(AlipaySsoUtil.getFromRequest(request, response, sdkConfig)).thenReturn(loginUser);

  • 3个注解对比:

@InjectMocks --- injects mock or spy fields into tested object automatically.

这个注解不会把一个类变成mock或是spy,但是会把当前对象下面的Mock/Spy类注入进去,按类型注入。

@Mock

生成的类,所有方法都不是真实的方法,而且返回值都是NULL。

@Spy ---Creates a spy of the real object. The spy calls real methods unless they are stubbed.

生成的类,所有方法都是真实方法,返回值都是和真实方法一样的,同时可以对部分方法进行模拟。

比如:doReturn("twotwo").when(ps).getPriceTwo(); 

注意:当使用参数匹配器时,所有参数都应使用匹配器。 如果要为参数使用特定值,则可以使用Mockito.eq()方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值