繁体   English   中英

gmock可以模拟Java类的静态方法吗? 另类?

[英]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()

GMock文档似乎表明您可以做到:

模拟静态方法调用和属性调用类似于标准方法调用,只需添加static关键字:

def mockMath = mock(Math)
mockMath.static.random().returns(0.5)

play {
  assertEquals 0.5, Math.random()
}

Scala没有静态方法,因此也难怪您无法嘲笑一种方法-它不存在。

您引用的方法loadXmlXML 对象上找到。 您可以使用scala.XML$.MODULE$从Java获取该对象,但是由于对象是单例的,因此其类是最终的。

可惜的是, loadXML是在该类中定义XMLLoader ,其目的XML延伸,而不是在对象XML本身。 因此,您可以简单地对XMLLoader进行普通模拟。 它将缺少一些方法,但是也许它将满足您的所有需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM