我正在编写一个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特定的问题。
- 如果我在消费者测试中添加标题,我会得到500状态错误返回
通常,这意味着你被告知你要做某事,但没有去做。在这种情况下,我的猜测是承载令牌不匹配,或者它没有收到正确的报头。应该有详细的日志或junit报告。
对于处理身份验证/授权,您可能需要阅读以下策略:https://docs.pact.io/provider/handling_auth
- 正如您刚刚在消费者中看到的,我试图添加授权头,但在提供者中它将过期,所以我必须找到一种方法来破解一些东西并提供有效的令牌。
- 在提供者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_at
为started_at
+ 100年。
这里重要的是让它为相同的输入参数生成相同的令牌,否则头将不同,这将导致新的协议由经纪人考虑。这极大地改变了方法—您基本上需要验证每个新协议每次.
关于处理异常的问题。不要这样作弊
httpRequest.addHeader("Authorization", "Bearer " + "eyJ0eXAiOiJKV1Qi");
让您的客户端类代码有机会自然地传递值,以某种方式传递它或使用相同的JwtTestHelper