当前位置: 首页 > 知识库问答 >
问题:

单元测试在执行期间冻结

樊杰
2023-03-14

所以,我的问题是,我正在尝试为我的应用程序进行单元测试。我有两个服务,我们叫它们Foo和Bar,Foo只是Bar的代理。

因此,Foo服务的路由器如下所示:

fun fooRoute(...) = coRouter {
    . . .
    GET("/something", fooHandler::findSomething)
    . . .
}

向Bar服务发出请求的处理程序如下所示:

fun fooHandler(barClient: WebClient) {
    . . .
    suspend fun findSomething(request: ServerRequest): ServerResponse {
        val response = barClient.get()
            .uri(...)
            .accept(...)
            .awaitExchange()
        . . .
        return when (response.statusCode()) {
            HttpStatus.OK -> {
                ServerResponse
                    . . .
                    .bodyValueAndAwait(response.awaitBody<SomeType>())
            }
            else -> { 
                ServerResponse
                    . . .
                    .buildAndAwait()
            }
        }
    }
    . . .
}

当我这样写测试时:

. . .
private val barClient = mockk<WebClient>()

private val fooHandler = FooHandler(barClient)
private val fooRouter = FooRouter()
private val fooClient = WebTestClient.bindToRouterFunction(
    fooRouter.fooRoute(
        // mocks
        . . .
        fooHandler
    )
).build()

@Nested
inner class FindSomething {

    @Test
    fun `returns OK`() = runBlocking {

        val response = mockk<ClientResponse>()
        val spec = mockk<WebClient.RequestHeadersUriSpec<*>>()

        coEvery { response.awaitBody<SomeType>() } returns SomeType(...)
        coEvery { spec.awaitExchange() } returns response
        coEvery { barClient.get() } returns spec

        fooClient
            .get()
            .uri(...)
            .exchange()
            .expectStatus().is2xxSuccessful

        . . .
    }
}

它永远冻结了......嗯,我想这是因为它周围的一些协程魔法,但是因为我在这方面还是新手,我不明白这里到底发生了什么。有什么帮助吗?

共有1个答案

长孙永思
2023-03-14

Welp,我根据这个答案编写了自己的交换函数,解决了这个问题。下面是我如何做到这一点的示例:

kotlin prettyprint-override">. . .
fun setUpBarClient(exchangeFunction: ExchangeFunction) {
    barClient = barClient.mutate()
        .exchangeFunction(exchangeFunction)
        .build()

    // recreate fooHandler & fooClient
}

@Nested
inner class FindSomething {

    @Test
    fun `returns OK`() {

        // this one from org.springframework.web.reactive.function.client.ExchangeFunction

        val exchangeFunction = ExchangeFunction {
            Mono.just(
                ClientResponse.create(HttpStatus.OK)
                    .header(...)
                    .body(...)
                    .build()
            )
        }

        setUpBarClient(exchangeFunction)

        fooClient
            .get()
            .uri(...)
            .exchange()
            .expectStatus().is2xxSuccessful

        . . .
    }
}
 类似资料:
  • 问题内容: 运行PHPUnit测试时,我希望能够转储输出,以便可以调试一两个东西。 我已经尝试了以下内容(类似于PHPUnit Manual示例 ); 结果如下: 请注意,没有预期的输出。 截至2011年9月19日,我使用的是git版本的HEAD版本。 输出: 我做错了什么吗,还是潜在的PHPUnit错误? 问题答案: 更新 刚刚意识到实现此目的的另一种方法比命令行选项要好得多: 这样,您可以随时

  • 问题内容: 我正在尝试为程序中用来验证表单的简单bean编写单元测试。Bean带有注释,并具有使用初始化的类变量 我想为此类中的验证方法编写单元测试,但是,如果可能的话,我希望在不利用属性文件的情况下这样做。我这样做的原因是,如果我从属性文件中提取的值发生更改,我希望这不会影响我的测试用例。我的测试用例正在测试验证值的代码,而不是值本身。 有没有一种方法可以在测试类中使用Java代码来初始化Jav

  • 我试图为一个简单的bean编写单元测试,这个bean在我的程序中用来验证表单。bean使用进行注释,并具有一个使用 我想为这个类中的验证方法编写单元测试,但是,如果可能的话,我希望在不使用属性文件的情况下这样做。我的理由是,如果我从属性文件中提取的值发生了变化,我希望这不会影响我的测试用例。我的测试用例测试的是验证值的代码,而不是值本身。 有没有一种方法可以在我的测试类中使用Java代码来初始化一

  • 问题内容: 我为我的一个脚本创建了一个小GUI。一切都很好。 当我单击一个按钮时,它会启动一个很大的功能,该功能正在解析某些网站中的许多数据。 但是,一旦我单击了Button,程序就会冻结,直到该功能完全运行为止。一切正常,但是为什么我的GUI在执行功能时冻结了。我想打印一个进度条,但这是不可能的。 这是程序的一部分: 在执行Module_1.main()时,我无法执行任何操作//打印任何内容…

  • 对于我系统中的一个单例类,我很难在类测试期间将析构函数报告为“覆盖”(代码覆盖分析部分)。我认为这是因为测试框架在我的静态单例实例之前就被破坏了,因此我试图通过稍后创建单例实例来改变破坏顺序——而不是在程序启动时。 我的公共getInstance方法现在看起来像这样: 构造函数像往常一样是私有的,但我没有经典的单例静态实例指针作为类成员。相反,我将实例存储为静态函数内部数据(如上所示),该数据是在

  • 问题内容: 这是我的java类: 这是单元测试: 测试失败,因为没有任何人注入。我应该如何正确处理这种情况?是否存在最佳实践? 问题答案: 如果没有像Spring这样的容器(或诸如基于Spring的Unitils之类的容器),则必须手动注入实体管理器。在这种情况下,您 可以 将以下内容用作基类: