我的PACT测试有什么问题,如何解决?



我正在编写一个Pact消费者和提供者测试。我现在基本上有三个问题。

@Pact(provider = PROVIDER, consumer = CONSUMER)
public RequestResponsePact getAddress(PactDslWithProvider builder) {
PactDslJsonBody body = new PactDslJsonBody()
.stringType("key1", "73501")
.stringType("key2", "value");
final Map<String,String> headers = new HashMap<>();
headers.put("Authorization","Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1");
return builder
.given("Something.")
.uponReceiving("Dto")
.path("/amz/ags")
.query("code=9999")
.method("GET")
.headers(headers)
.willRespondWith()
.status(200)
.body(body)
.toPact();
}

1)如果我在消费者测试中添加标题,我将得到一个500状态错误返回

2)正如您刚刚在消费者中看到的那样,我试图添加授权头,但在提供者中它将过期,因此我必须找到一种方法来破解某些内容并提供有效的令牌。

3)在提供程序REST Api中,其他服务正在被调用,但似乎我必须至少在调用异常时嘲笑它们。老实说,我也不知道该怎么做。我需要用哪种方法来做。既然外部api还在运行,我为什么要模拟它们呢?

for 2) I found a solution

@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactVerificationTestTemplate(PactVerificationContext context, HttpRequest httpRequest) {
httpRequest.addHeader("Authorization", "Bearer " + "eyJ0eXAiOiJKV1Qi");
context.verifyInteraction();
}

但是现在我在context.verifyInteraction()中得到一个异常。很奇怪。

我不能回答JVM特定的问题。

  1. 如果我在消费者测试中添加标题,我会得到500状态错误返回

通常,这意味着你被告知你要做某事,但没有去做。在这种情况下,我的猜测是承载令牌不匹配,或者它没有收到正确的报头。应该有详细的日志或junit报告。

  1. 正如您刚刚在消费者中看到的,我试图添加授权头,但在提供者中它将过期,所以我必须找到一种方法来破解一些东西并提供有效的令牌。
对于处理身份验证/授权,您可能需要阅读以下策略:https://docs.pact.io/provider/handling_auth
  1. 在提供者REST Api中,其他服务正在被调用,但似乎我必须至少在它们被调用异常抛出时嘲笑它们。老实说,我也不知道该怎么做。我需要用哪种方法来做。为什么我必须模拟它们,因为外部api正在运行。

Pact旨在更接近单元测试,不建议在Pact测试期间运行外部服务,因为这会降低测试的确定性。请参阅讨论提供商测试覆盖率的这一节:https://docs.pact.io/5-minute-getting-started-guide#scope-of-a-provider-pact-test.

关于如何处理令牌过期的问题,我是这样做的。

给定:

  • JWT令牌包含expire_at请求

我写了一个小库,在所有项目中共享,我有一个像JwtTestHelper这样的类,它生成任何JWT,令牌started_at日期作为常数日期expire_atstarted_at+ 100年。

这里重要的是让它为相同的输入参数生成相同的令牌,否则头将不同,这将导致新的协议由经纪人考虑。这极大地改变了方法—您基本上需要验证每个新协议每次.

关于处理异常的问题。不要这样作弊

httpRequest.addHeader("Authorization", "Bearer " + "eyJ0eXAiOiJKV1Qi");

让您的客户端类代码有机会自然地传递值,以某种方式传递它或使用相同的JwtTestHelper

进行模拟

最新更新