尝试在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之外,我根本不关心资产。
答案 0 :(得分: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}