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 时分配了模拟资产。

任何人都可以阐明这一点吗?如果原因是由于分配,有没有办法解决它?或者我是错误地接近这个还是我错过了一些明显的东西。

它是 grails 1.3.6(到 Grails 2 的移植暂时不会完成,所以暂时使用这个版本)。

谢谢。

更新:

好的,所以我通过声明模拟对象来解决强制转换异常,例如:

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

但现在看来我必须为测试资产声明所有非空属性。这似乎不对。对于测试,我根本不关心资产,除了它的 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 回答