【问题标题】:Grails: Returning a mocked object from a mocked serviceGrails:从模拟服务返回模拟对象
【发布时间】:2012-10-17 09:19:46
【问题描述】:

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

但现在看来我必须声明 all 测试资产的非空属性。这似乎不对。对于测试,我根本不关心 Asset,除了它的 Id。

【问题讨论】:

    标签: unit-testing grails mocking


    【解决方案1】:

    您模拟的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}
    

    【讨论】:

    • 谢谢,这似乎有所帮助。不知道我是怎么错过的。现在我得到了进一步的错误,但我认为这是因为在调用 generateAsset 之后在 CreatorService 中调用了模拟对象,所以我需要弄清楚这一点。谢谢!
    • 是的,您必须在 createMock 之前向 mockAsset 添加适当的要求。
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2013-11-04
    • 2011-02-10
    相关资源
    最近更新 更多