Unit testing Spock-超时后成功通过测试

Unit testing Spock-超时后成功通过测试,unit-testing,groovy,spock,Unit Testing,Groovy,Spock,在Spock中,您可以设置超时,在此之后测试将失败 @Timeout(value = 1500, unit = TimeUnit.MILLISECONDS) def "this method should not run longer than 2 seconds"() { given: userFilter = buildUserFilter(); // criteria to search users. exportDestination = buildDestina

在Spock中,您可以设置超时,在此之后测试将失败

@Timeout(value = 1500, unit = TimeUnit.MILLISECONDS)
def "this method should not run longer than 2 seconds"() {
    given:
    userFilter = buildUserFilter(); // criteria to search users.
    exportDestination = buildDestination(); // where to export users.

    expect: "should not take long"
    userService.exportUsers(userDetails);
}
现在我需要相反的东西:测试应该在超时后通过

def "should block and wait until user-microservice is up"() {
    given:
    userExportMicroserviceClient = mock()
    userExportMicroserviceClient.getUsers(_) >> httpNotFound

    expect: "should block the current thread because userMicroservice is down"
    failHere()
}
我知道,依赖其他服务的可用性是一件坏事。此功能仅在数据迁移期间运行,与日常任务无关


同样,我有一个方法可以从用户微服务中为用户提供服务,它会一直阻塞,直到用户微服务启动。如何测试它?

这取决于您是如何实现
exportUsers()
方法的。 假设它每秒拉动一个微服务。如果是这样,您可以按顺序模拟微服务的响应:向下、向下、向上

// The timeout includes 2 seconds of microservice down.
@Timeout(value = 3500, unit = TimeUnit.MILLISECONDS)
def "should block and wait until user-microservice is up"() {
    given: "mocked microservice which is not available for first 2 calls and available on 3rd call"
    userExportMicroserviceClient = mock()
    userExportMicroserviceClient.getUsers(_) >>> [httpNotFound, httpNotFound, httpOk]

    when: "calling the user getting should take long time"
    def actualResult = userService.exportUsers(userDetails)

    then:
    def expectedResult = <prepare>
    actualResult == expectedResult
}
//超时包括2秒的微服务关闭。
@超时(值=3500,单位=时间单位。毫秒)
def“应阻止并等待用户微服务启动”(){
给定:“模拟微服务,前两次呼叫不可用,第三次呼叫可用”
userExportMicroserviceClient=mock()
userExportMicroserviceClient.getUsers()>>>[httpNotFound,httpNotFound,httpOk]
当:“呼叫用户应花费很长时间”
def actualResult=userService.exportUsers(userDetails)
然后:
def expectedResult=
实际结果==预期结果
}

当然,这是一个伪代码,需要您针对特定项目进行更正。

我可能会误解您的想法。请用一个实际可行的例子()更新你的问题,这个例子说明了你想要什么。我需要一些我可以编译和运行的东西。缺少依赖项的伪代码没有帮助。我就是这样做的!