java - gmock 可以模拟 Java 类的静态方法吗?选择?

标签 java scala groovy gmock

我无法让它工作。就像该方法没有被 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/

相关文章:

java - 匹配两个字符串中长度为 2(同一索引)的子序列

java - NoClassDefFoundError org.hibernate.engine.spi.SharedSessionContractImplementor 同时使用 hibernate 5.1.0 和 Spring 5.1.3

scala - 以编程方式从 Storm Bolt 杀死拓扑时出现编译错误 : object and package with same name

grails - 从选择标签中选择多个值 - Grails

gradle - 如何在用Java编写的自定义插件中配置Gradle TestNGOptions?

java - Hibernate - 如何通过 Hibernate 将 java.net.URL 存储到数据库中

java - 向下类型转换对象和调用方法

java - 如何取消Spark Hadoop RDD计算

scala - Scala创建列表[Int]

file-io - 在 Groovy 中写入文件突然停止