如何为我的所有Spock集成测试模拟Spring Boot服务的一部分?

时间:2019-05-31 17:58:05

标签: spring-boot groovy mocking spock

我正在使用Spock为我的Spring Boot应用程序创建集成测试,但是在弄清楚如何为我的测试用例所有模拟服务的一部分时遇到了麻烦。

我的应用程序写入运行在Gremlin Graph模式下的Azure Cosmos数据库,并且由于我不知道任何内存数据库来充分模拟它,因此我想确保仅写入我的开发数据库的任何服务与标有当前测试的随机UUID的实体进行交互。因此,任何读取/写入数据库的服务都需要确保在任何查询中都包含当前的测试ID。

通过Spock模拟抽象基类中的几个重用方法的最佳方法是什么?

GraphService.groovy <==具有一些我想模拟的方法的抽象类。

abstract class GraphService {
    @Autowired 
    protected GraphTraversalSource g

    protected GraphTraversal buildBaseQuery() {
        return g.V()
    } 

    protected GraphTraversal buildBaseCreationQuery(String label) {
        return g.addV(label)
    }
}

几个数据库搜索/修改服务都继承了上述类。对于我的所有测试,我想要g.V()而不是g.V().has("testID", testId),而我想要g.addV(label)而不是g.addV(label).property("testID", testId)。我如何在所有集成测试中都做到这一点?我尝试创建一个指定此行为的基本规范类,但是没有用。

TestConfig.groovy

@Configuration
class TestConfig {
    @Bean
    @Primary
    GraphPersistenceService persistenceService(
            GraphTraversalSource g) {
        DetachedMockFactory mockFactory = new DetachedMockFactory()
        GraphPersistenceService persistenceService = mockFactory.Stub( //Mock doesn't work either
            [constructorArgs: [g]], GraphPersistenceService)
        return graphPersistenceService
    }
}

BaseIntegrationTest.groovy

class BaseIntegrationTest extends Specification {
    @Autowired
    TestUtil testUtil

    @Autowired
    GraphTraversalSource g

    @Autowired
    GraphPersistenceService persistenceService

    def setup() {
        persistenceService.buildBaseQuery >> g.V().has("testID", testUtil.id)
        persistenceService.buildBaseCreationQuery(_ as String) >> { label ->
            g.addV(label).property("testID", testUtil.id)
        }
    }

    def cleanup() {
        testUtil.removeAllEntitiesWithCurrentTestId()
    }
}

然后在实际测试中:

@SpringBootTest(classes = MyGraphApplication.class)
@ContextConfiguration(classes = [GraphDbConfig.class, TestConfig.class])
@ActiveProfiles("test")
@TestPropertySource(locations = 'classpath:application-local.properties')
class UserOfPersistenceServiceSpec extends BaseIntegrationTest {
    @Autowired
    UserOfGraphPersistenceService userOfPersistenceService

    def "Can create a bunch of vertices"() {
        expect:
        userOfPersistenceService.createABunchOfVertices() == 5
    }
}

PS。我正在使用Spring 1.5.10.RELEASE和groovy 2.4.15 ...

1 个答案:

答案 0 :(得分:0)

如果您可以选择升级到Spock 1.2,则建议放弃TestConfig类并使用@SpringBean批注。

这是我如何在测试中进行设置的示例:

@ActiveProfiles(["integrationtest"])
@DirtiesContext
abstract class IntegrationTest extends Specification {

    @SpringBean
    EurekaClient eurekaClient = Mock() {
        getNextServerFromEureka(*_) >> Mock(InstanceInfo) {
            getHomePageUrl() >> "test.test"
        }
    }

//    ... other stuff
}