我无法让它工作。就像该方法没有被 mock 一样。
是否有替代的常规测试框架可以更好地模拟静态 Java 方法?
2011 年 3 月 2 日更新:添加代码:
我实际上正在尝试模拟 Scala XML.loadXml(我正在尝试使用 Groovy 进行单元测试)类:
这是我的测试用例:
// ContentManagementGatewayTest.groovy
class ContentManagementGatewayTest extends GMockTestCase
{
void testGetFileList()
{
// Preparing mocks code will go here, see below
play {
GetFileGateway gateway = new GetFileGateway();
gateway.getData();
}
}
}
// GetFileGateway.scala
class GetFileGateway {
def getData()
{
// ...
val xmlData = XML.loadData("file1.txt");
}
}
我尝试使用 gmock 和 metaClass 进行测试:
// metaClass:
XML.metaClass.'static'.loadFile = {file ->
return "test"
}
// gmock:
def xmlMock = mock(XML)
xmlMock.static.loadFile().returns(stream.getText())
最佳答案
您可以使用 Groovy(元编程)来完成此操作,不需要任何额外的库。这是一个(愚蠢的)示例,它覆盖 Collections.max
,使其始终返回 42。在 Groovy 控制台中运行此代码来测试它。
// Replace the max method with one that always returns 42
Collections.metaClass.static.max = {Collection coll ->
return 42
}
// Test it out, if the replacement has been successful, the assertion will pass
def list = [1, 2, 3]
assert 42 == Collections.max(list)
更新
您在评论中提到我的建议不起作用。这是与您在问题中显示的代码相对应的另一个示例。我已经在 Groovy 控制台中测试了它,它对我有用。如果它不适合您,请告诉我您的测试与我的测试有何不同。
Math.metaClass.static.random = {-> 0.5}
assert 0.5 == Math.random()
关于java - gmock 可以模拟 Java 类的静态方法吗?选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165156/