Grails:从模拟服务返回模拟对象

时间:2012-10-17 09:19:46

标签: unit-testing grails mocking

尝试在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@56c88357'与班级' grails.test.GrailsMock'上课' com.xxxxxx.Asset

我认为这是由于在MyService调用generateAsset时分配了模拟资产。

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

它的grails 1.3.6(Grails 2的端口赢了很长一段时间,所以坚持使用这个版本一段时间了。)

感谢。

更新

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

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

但现在看来我必须为测试资产声明 all 非空属性。这看起来不对。对于测试,除了Id之外,我根本不关心资产。

1 个答案:

答案 0 :(得分:3)

您的模拟generateAsset()方法不需要返回assetmockFor(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}