[英]Can gmock mock static methods of Java classes? Alternative?
我无法正常工作。 就像方法没有被嘲笑一样。
是否有替代的groovy测试框架可以更好地模拟静态Java方法?
更新02 / Mar / 2011 :添加代码:
我实际上是在尝试模拟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()
Scala没有静态方法,因此也难怪您无法嘲笑一种方法-它不存在。
您引用的方法loadXml
在XML
对象上找到。 您可以使用scala.XML$.MODULE$
从Java获取该对象,但是由于对象是单例的,因此其类是最终的。
可惜的是, loadXML
是在该类中定义XMLLoader
,其目的XML
延伸,而不是在对象XML
本身。 因此,您可以简单地对XMLLoader
进行普通模拟。 它将缺少一些方法,但是也许它将满足您的所有需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.