2

Grails(1.3.6)でサービスの単体テストを行おうとすると問題が発生します。

このサービスには、オブジェクトの作成に使用する別のサービスのインスタンスがあります。クリエーターサービスとそれが返すオブジェクトをモックしようとしています。

テストクラスでは:

mockMyService = new MyService() // service under test

// Fake Asset object to 'create'
asset = mockFor(Asset)
asset.createMock()

// Mock the CreatorService and return the mocked asset
mockCreatorService = mockFor(CreatorService)
mockCreatorService.demand.generateAsset(){Section s, Date d, User u, AssetStatus a, String name -> return asset}

mockMyService = new MyService()
mockMyService.assetService = mockCreatorService.createMock()

デバッグと検査から、モックオブジェクトは正常に作成され、サービスは正しくモックされ、generateAsset呼び出しを偽造していると確信しています。

MyServiceでは、他の(作成者)サービスへの呼び出しは次のとおりです。

Asset asset = creatorService.generateAsset(section, date, author, status, assetName)

このエラーが発生します:

クラス'grails.test.GrailsMock'のオブジェクト'grails.test.GrailsMock@56c88357'をクラス'com.xxxxxx.Assetにキャストできません

これは、MyServiceによるgenerateAssetの呼び出しでモックされたアセットが割り当てられたためだと思います。

誰かがこれに光を当てることができますか?理由が割り当てによるものである場合、それを回避する方法はありますか?それとも、これに間違ってアプローチしているのでしょうか、それとも明らかな何かを見逃しているのでしょうか。

それはgrails1.3.6です(Grails 2への移植はしばらくの間完了しないので、しばらくの間このバージョンで立ち往生しています)。

ありがとう。

アップデート:

OKで、次のようなモックオブジェクトを宣言することでキャスト例外を回避しました。

def testAssets = [
 new Asset(id:123, name:......)]
mockDomain(Asset, testAssets)

しかし、今では、テストアセットのnull以外のすべてのプロパティを宣言する必要があるようです。これは正しくないようです。テストでは、アセットのIDを除いて、アセットについてはまったく気にしません。

4

1 に答える 1

3

モックgenerateAsset()されたメソッドはasset( mockFor(Asset)) ではなく、その を呼び出して返された値を返す必要がありcreateMock()ます。

// Fake Asset object to 'create'
mockAsset = mockFor(Asset)
def asset = mockAsset.createMock()

// Mock the CreatorService and return the mocked asset
mockCreatorService = mockFor(CreatorService)
mockCreatorService.demand.generateAsset(){Section s, Date d, User u, AssetStatus a, String name -> return asset}
于 2012-10-17T11:35:11.187 に答える