gpt4 book ai didi

unit-testing - Grails:从模拟服务返回模拟对象

转载 作者:行者123 更新时间:2023-12-02 13:57:38 24 4
gpt4 key购买 nike

我在尝试在 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 的调用中分配了模拟 Assets 。

任何人都可以阐明这一点吗?如果原因是由于任务,有没有办法解决?或者我是否错误地处理了这个问题,或者我错过了一些明显的东西。

它是 grails 1.3.6(Grails 2 的端口暂时不会完成,所以暂时停留在这个版本上)。

谢谢。

更新:

好的,所以我通过声明模拟对象来解决强制转换异常,例如:
def testAssets = [
new Asset(id:123, name:......)]
mockDomain(Asset, testAssets)

但是现在看来我必须为测试 Assets 声明所有非空属性。这似乎不对。对于测试,除了它拥有的 ID 之外,我根本不关心 Assets 。

最佳答案

你的 mock 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}

关于unit-testing - Grails:从模拟服务返回模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12931018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com