1

これがn00bの質問である場合はご容赦ください、私はgrailsのn00bです...

を使用して「rest」プラグインをインストールしましたgrails install-plugin rest

私のサービスクラスには次のコードがあります(編集済み):

def index() {
  def data

  withRest(uri:'http://localhost:8090/some/valid/url/running/here/') {
    auth.basic 'admin', 'admin'
    def response = get(path: 'something', query: [format: 'json'])
    data = response.data
  }
  return data
}

を実行grails consoleし、サービスクラスをインスタンス化して呼び出すとservice.index()、期待どおりのJSON結果が得られます。このコードは期待どおりに機能します。これは、コントローラーを介して機能します。統合テストを介してコントローラーを介して機能します。

これが私のユニットテストです:

void testIndex() {
    def response = service.index()
    assertEquals(response.total, 2)
    assertEquals(response.receipts.size, 2)
    assertEquals(response.receipts.collectEntries{ [it.id, [id: it.id]] }, [1: [id:1], 2:[id:2]])
}

これはエラーで失敗します:

groovy.lang.MissingMethodException: No signature of method: torch.ReceiptService.withRest() is applicable for argument types: (java.util.LinkedHashMap, torch.ReceiptService$_index_closure1) values: [[uri:http://localhost:8090/some/valid/url/running/here/], ...]

したがって、テストの実行中は、プラグインがアクティブではないようです。プラグインに関する追加の設定は行っていません。テスト環境でこのクラスを別の方法でコンパイルする必要がある理由がよくわかりません。

私の意図は、外部依存関係があるため、これを実行した後、ネットワークインターフェイスをモックすることでした。しかし、私はそれを一歩ずつ進めています。

withRest()テストを実行するためにモックを注入する必要がありますか?それとも何か他のものが間違っていますか?

ありがとう!

4

1 に答える 1

5

これがユニットテストの仕組みです。アクティブなプラグインはなく、SpringやHibernateなどもありません。クラスを実行しているだけなので、すべてをモックする必要があります。しかし、RESTはモックの候補としては不十分なようです。それ以来、モックをテストしているだけです。

私はおそらく機能テストでそれをテストするでしょう。残念ながら、これは単体テストよりも便利ではありませんが、悪いテストはあまり役に立ちません:)構成でURLが検索されるように構成して、テスト用に別のURLを許可し、外部サービスにアクセスする必要がないようにすることができます。 、次に、既知の値を返すテスト用の実際のRESTサービスをセットアップします。

于 2012-06-15T02:16:08.983 に答える