首先我们要导入相应的包
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.8.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.4.12</version> <scope>test</scope> </dependency>
public static boolean webchatEnable(String language){ .... } public static String getWebChatPages(String language){ .... } private static boolean webchatInHours(){ .... } private static boolean webchatLanguageEnable(String language){ ... } private static Calendar getCurrentTime(){ return Calendar.getInstance(); }
@RunWith(PowerMockRunner.class) //1 @PrepareForTest({PropertyApplicationContext.class,WebChatUtil.class}) //2 public class WebChatUtilTestCase extends AbstractJUnit { @Before public void init(){ PowerMockito.mockStatic(PropertyApplicationContext.class);// 3 PowerMockito.mockStatic(WebChatUtil.class); } @Test public void testWebchatEnable(){ try { Calendar c = Calendar.getInstance(); c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE), 16, 35); PowerMockito.spy(WebChatUtil.class); // 创建spy,如果不创建的话,后面调用WebChatUtil就都是Mock类,这里创建了spy后,只有设置了mock的方法才会调用mock行为 PowerMockito.doReturn(c).when(WebChatUtil.class, "getCurrentTime"); //Mock私有方法 } catch (Exception e) { e.printStackTrace(); } PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_HOURS)).thenReturn("0900,1800"); //4 - Mock静态方法,返回期望值 PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_LOCALES)).thenReturn("en,sc,cn"); Assert.assertTrue(WebChatUtil.webchatEnable("en")); PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_HOURS)).thenReturn("090,1800"); PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_LOCALES)).thenReturn("en,sc,cn"); Assert.assertFalse(WebChatUtil.webchatEnable("en")); PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_HOURS)).thenReturn("0900,1800"); PowerMockito.when(PropertyApplicationContext.getProperty(PropertyConstants.WEBCHAT_LOCALES)).thenReturn("en,sc,cn"); Assert.assertFalse(WebChatUtil.webchatEnable("th")); }
① 标注使用PowerRunner运行test(powermock会修改字节码)
② 设置mock类(支持多个类,逗号分隔),这个可以设置到class上,也可以设置到method上。这里面包含两种类型:
被mock的类(如上例MyStringUtil .class,如果mock类为系统类,如System.class,则不需要这里设置就可以使用)
context类,如果是在XxxServer里面希望mock MyStringUtil类,则要设置 XxxServer.class
③ 告诉powermock需要mock哪个类。(感觉这里配置和②有点重合)
④ 打桩,设置mock对象返回预期值。(测试mock方法还未执行)