如何分离需要共享模拟的测试?

时间:2018-09-26 15:45:35

标签: groovy spock

看看这个Spock测试,它执行得很好,但是可以在一个测试方法中测试多个项目。

class WorkbookPoolSpec extends Specification {
    def 'test pool'() {
        setup:
            def workbook = Mock(Workbook)
            def workbookFactory = Mock(WorkbookFactory)
            def workbookPool = new WorkbookPool(workbookFactory)

        when:
            workbookPool.borrowWorkbook()
        then:
            1 * workbookFactory.create() >> workbook

        when:
            workbookPool.returnWorkbook(workbook)
        then:
            1 * workbook.reset()
    }
}

实际上,我的测试时间更长,但需要在单个WorkbookPool实例上进行。

我尝试拆分下面的代码,但这没有用,因为您不能拥有@Shared Mocks,正如我从以下答案中了解到的:https://stackoverflow.com/a/41194168/923041

有没有任何避免使用单一的大型测试方法的方法?

@Stepwise
class WorkbookPoolSpec extends Specification {
    @Shared
    def workbook = Mock(Workbook)

    @Shared
    def workbookFactory = Mock(WorkbookFactory)

    @Shared
    def workbookPool = new WorkbookPool(workbookFactory)

    def 'workbook is created on check-out'() {
        when:
            workbookPool.borrowWorkbook()
        then:
            1 * workbookFactory.create() >> workbook
    }

    def 'workbook is reset on check-in'() {
        when:
            workbookPool.returnWorkbook(workbook)
        then:
            1 * workbook.reset()
    }
}

2 个答案:

答案 0 :(得分:1)

根据我的理解,声明模拟的全部要点是:“我的测试执行验证标准是对模拟对象上的方法的实际调用进行了验证”(否则,没有理由使用模拟)。 / p>

但是,如果是这样,共享模拟就没有意义了,一旦完成一个测试(通过验证),该模拟就变得无关紧要了。

现在,真正的问题是为什么您要说:“但需要在单个WorkbookPool实例上工作”。

也许值得考虑重构代码,以便创建WorkbookPool(BTW看起来很棒,因为它只有一个依赖项)将确实是一件容易的事,因此,为每个单独的人创建新的模拟将不再是问题。测试。

这种方式应该可以满足对WorkbookPool对象公开的方法进行单元测试的需求

如果单个测试应覆盖流的第2端,那么可能最好使用多个when / then,尽管我个人并不使用这种测试

答案 1 :(得分:1)

您可以将var result = data["ROOT"]["CATEGORY_AREA_LIST"]["CATEGORY_AREA"].filter(function(area) { return (area["@attributes"]["CATEGORY_AREA_NAME"] === "General") }) DetachedMockFactory(1.2中的新功能)一起使用。

@AutoAttach