我在尝试在 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。