0

私はそれを動かすことができませんでした。メソッドがモックされていないようです。

静的Javaメソッドをモックするのに適した代替のGroovyテストフレームワークはありますか?

2011年3月2日更新:コードの追加:

私は実際にScalaXML.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())
4

3 に答える 3

3

これは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()
于 2011-03-02T09:57:51.833 に答える
2

GMockのドキュメントには、次のことができることが示されているようです。

静的メソッド呼び出しとプロパティ呼び出しのモックは、標準のメソッド呼び出しに似ていますが、staticキーワードを追加するだけです。

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

play {
  assertEquals 0.5, Math.random()
}
于 2011-03-02T10:23:20.960 に答える
2

Scalaには静的メソッドがないので、それをモックできなかったのも不思議ではありません。それは存在しません。

loadXml参照するメソッドは、XML オブジェクトにあります。そのオブジェクトはJavaから取得できますscala.XML$.MODULE$が、オブジェクトはシングルトンであるため、そのクラスはfinalです。

残念ながら、オブジェクト自体ではなく、オブジェクトが拡張loadXMLするクラスで定義されます。したがって、通常ののモックを簡単に実行できます。いくつかの方法が欠けていますが、おそらくそれはあなたが必要とするすべてを行うでしょう。XMLLoaderXMLXMLXMLLoader

于 2011-03-02T13:50:05.093 に答える