【发布时间】:2012-09-07 02:42:55
【问题描述】:
我正在使用 XX 类的静态方法进行遗留单元测试。我现在更改了类以从 Spring 应用程序上下文中获取字段值。由于无法初始化 XX 类,单元测试现在失败。
我不能用 dummysupport 类包装 XX 类,因为要测试的逻辑很复杂,而且对 XX 类的调用嵌套在对其他遗留类的多层调用中。 所以我试图找到一种方法来模拟类 XX 中的静态方法。有没有办法做到这一点?我正在使用 Jmock 库。
【问题讨论】:
我正在使用 XX 类的静态方法进行遗留单元测试。我现在更改了类以从 Spring 应用程序上下文中获取字段值。由于无法初始化 XX 类,单元测试现在失败。
我不能用 dummysupport 类包装 XX 类,因为要测试的逻辑很复杂,而且对 XX 类的调用嵌套在对其他遗留类的多层调用中。 所以我试图找到一种方法来模拟类 XX 中的静态方法。有没有办法做到这一点?我正在使用 Jmock 库。
【问题讨论】:
似乎没有办法在 JMock 中模拟静态方法。见this related thread。 JMock 的创建者似乎采取精英主义观点,即如果您的代码中有静态方法,则您的代码不值得使用 JMock 进行测试。
我建议使用像 JMockit 这样的工具,它提供了功能更全面的模拟工具集。
【讨论】:
我相信 powermock 允许您像详细 here 那样模拟静态数据
我过去也遇到过这个问题,并设法围绕它编写代码,因此我可以通过使方法非静态但对类具有静态引用来使用 JMock。
例如
public ClassToMock {
public static final ClassToMock INSTANCE = new ClassToMock();
private ClasstToMock() {};
public void newNonStaticMethod1(){}
}
而不是
public ClassToMock {
public ClasstToMock() {};
public void static origStaticMethod1(){}
}
现在你的方法调用将是
ClassToMock.INSTANCE.newNonStaticMethod1();
由于 newNonStaticMethod1() 不是静态的,您现在可以模拟它。
由于 CalssToMock ctor 是私有的,它只能通过静态实例访问。
【讨论】: