Mock策略
总览
- 在类上使用
@RunWith(PowerMockRunner.class)
注解。 - 在类上使用
@MockPolicy(MyMockPolicy.class)
注解。
示例
可以使用Mock策略使得与PowerMock隔离的某些框架的代码的单元测试变得更容易。Mock策略的实现可以是如抑制某些方法,抑制静态初始化程序或拦截方法调用,并更改某些框架或一组类或接口的返回值(例如,返回模拟对象)。例如,可以实施Mock策略来避免为测试编写重复的设置代码。假设您使用的是框架X,并且要对其进行测试,则要求某些方法应始终返回模拟实现。或许也必须抑制某些静态初始化程序。与其在测试之间复制该代码,不如编写一个可重用的Mock策略。
PowerMock 1.1提供了三种开箱即用的模拟策略,用于模拟slf4j,java common-logging和log4j。让我们以slf4j为例,假设您有一个看起来像这样的类:
public class Slf4jUser {
private static final Logger log = LoggerFactory.getLogger(Slf4jUser.class);
public final String getMessage() {
log.debug("getMessage!");
return "log4j user";
}
}
这里有一个问题,因为logger在Slf4jUser类的静态初始化器中实例化。有时,这会导致问题,具体取决于日志配置,因此在单元测试中要做的是‘存根’(或者说是‘打桩’)日志实例。这是完全可行的,无需使用Mock策略。一种方法是从测试中禁止Slf4jUser类的静态初始化程序开始。然后,我们可以创建Logger类的存根或漂亮的模拟并将其注入Slf4jUser实例。但这还不够,假设我们已经配置了slf4j以使用log4j作为后端日志,那么在运行测试时,控制台中将显示以下错误:
log4j:ERROR A "org.apache.log4j.RollingFileAppender" object is not assignable to a org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
log4j:ERROR [org.powermock.core.classloader.MockClassLoader@aa9835] whereas object of type
log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [sun.misc.Launcher$AppCl