- 私有/静态字段的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()方法.