PowerMockito单元测试(3)-私有静态方法单元测试与stub方法

3. 私有静态方法单元测试:

 【公共方法&私有方法】:
public class UserUtil{
     
	
	public static String generateUserToken(String userId){
     
		if(StringUtils.isEmpty(userId)){
     
			return StringUtils.EMPTY;
		}
		PublicKey key = getPublicKey(userId);
		if(key == null){
     
			return StringUtils.EMPTY;
		}
		String token = getTokenByKey(key);
		return token;
	}

	private static PublicKey getPublicKey(String userId){
     
		PublicKey publicKey = null;
		try{
     
			 byte[] publicKeyBytes = Base64Utils.decodeFromString(userId);
			 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
			 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			 publicKey = keyFactory.generatePublic(keySpec);
		}catch(IOException|NoSuchAlgorithmException e){
     
			systemErrorRecoder.addMsgError(e.getMessage());
		}
		return publicKey;
	}
}
 【公共方法单元测试】:
@RunWith(PowerMockRunner.class)	// 必要,确保使用PowerMock框架引擎执行单元测试
@PowerMockIgnore("javax.management.*")//解决报错previously initiated loading for different type with name "javax/managemen
@PrepareForTest({
     UserUtil.class})
public class UserUtilTest{
     
	@Test
	public void testGenerateUserToken throws Exception(){
     
		Assert.assertEquals(StringUtils.EMPTY,UserUtil.generateUserToken("")); // 覆盖第一个if
		Assert.assertEquals(StringUtils.EMPTY,UserUtil.generateUserToken("testId")); // 覆盖第二个if
		
		//由于正常调用到getPublicKey会直接返回null,导致第二个if后面的代码不会被覆盖执行,通过下列stub操作来覆盖。
		PublicKey key = PowerMockito.mock(PublicKey.class);
		PowerMockito.stub(PowerMockito.method(UserUtil.class,"getPublicKey",String.class)).toReturn(key);// 重点
		Assert.assertNotNull(UserUtil.generateUserToken("testId"));
	}
}
	 
 【要点】:

PowerMockito.stub(PowerMockito.method(UserUtil.class,“getPublicKey”,String.class)).toReturn(key);

 【此处stub语义】:与PowerMockito.method一起使用,抑制方法执行,并返回期望值
          第一个参数方法所在的类,第二个参数为方法名,第三个参数为参数类型
          需要对stub的类添加到PrepareForTest里
  stub与PowerMockito.method一起非常好用!!!

 通过stub方法来阻断真实对象getPublicKey方法的执行,并用期望的key对象来代替返回。
 也就是说,当执行UserUtil.generateUserToken(“testId”)调用到getPublicKey方法时,不会进入方法内部执行,而是抑制该方法,直接返回key
 所以,第二个if的key判断不会为null,便可以往下覆盖。

 【私有静态方法测试】:
@RunWith(PowerMockRunner.class)	// 必要,确保使用PowerMock框架引擎执行单元测试
@PowerMockIgnore("javax.management.*")//解决报错previously initiated loading for different type with name "javax/managemen
@PrepareForTest({
     UserUtil.class,KeyFactory.class})
public class UserUtilTest{
     
	@Test
	public void testGetPublicKey(){
     
		PublicKey key = PowerMockito.mock(PublicKey.class);
		PowerMockito.stub(PowerMockito.method(KeyFactory.class,"generatePublic",X509EncodedKeySpec.class)).toReturn(key);
		Assert.assertNotNull(UserUtil.generateUserToken("testId"));
	}
}
 【要点】:

·通过公共方法generateUserToken来进入私有静态方法
·
·公共方法正常调用PublicKey key = getPublicKey(userId);时,在私有方法内部keyFactory.generatePublic(keySpec);会直接抛异常然后return
·
·通过stub方法,来阻断真实对象generatePublic方法执行,直接返回直接mock的key对象
·
·也就是说,当执行UserUtil.generateUserToken(“testId”)调用到keyFactory.generatePublic(keySpec);方法时,直接返回key对象,抑制内部方法执行,不会抛异常

你可能感兴趣的:(单元测试,单元测试,java,PowerMockito,Mockito,junit)