spring - 如何使用 PactVerificationSpringProvider 和 Junit5 为协议提供程序测试添加标头?
问题描述
我正在尝试使用junit5spring编写协议提供者测试。
目前我得到了例外:
1) Verifying a pact between external-service and my-app - includes headers "Content-Type" with value "[application/json]"
1.1) header: Expected a header 'Content-Type' but was missing
我应该如何添加标题?我已经尝试过这样的:
@TestTemplate
@ExtendWith(PactVerificationSpringProvider.class)
public void pactVerificationTestTemplate(PactVerificationContext context, HttpRequest request) {
request.addHeader("Content-Type", "application/json");
if (context != null) {
context.verifyInteraction();
}
}
但它也不起作用:
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [org.apache.http.HttpRequest request] in method [public void com.swisscom.abusehq.anonymizer.pact.PactProviderTest.pactVerificationTestTemplate(au.com.dius.pact.provider.junit5.PactVerificationContext,org.apache.http.HttpRequest)].
全班:
@ActiveProfiles("test")
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ContextConfiguration(classes = {MyTestConfiguration.class})
@Provider("my-app")
@PactBroker
(
consumerVersionSelectors = @VersionSelector(tag = "developer-build"),
authentication = @PactBrokerAuth(
username = "${pactbroker.auth.username}",
password = "${pactbroker.auth.password}"
)
)
@Slf4j
public class PactProviderTest {
@InjectMocks
MyController myController;
@Mock
MyService myService;
@TestTemplate
@ExtendWith(PactVerificationSpringProvider.class)
public void pactVerificationTestTemplate(PactVerificationContext context, HttpRequest request) {
request.addHeader("Content-Type", "application/json");
if (context != null) {
context.verifyInteraction();
}
}
@BeforeEach
void before(PactVerificationContext context) {
MockitoAnnotations.initMocks(this);
MockMvcTestTarget target = new MockMvcTestTarget();
target.setControllers(myController);
context.setTarget(target);
}
@State("account exists")
public void notificationForAccount(Map data) {
log.info("Now service in 'state 1' state: " + data);
doNothing().when(myService).sendNotification(any(MyRequest.class));
}
}
解决方案
1.1) header: Expected a header 'Content-Type' but was missing
此消息来自提供者端的响应验证。它告诉 pact 期望服务器返回Content-Type
标头,但它没有。您的应用程序应该为此和测试进行调整,即@RestController
:
@RequestMapping(value = "/my/url", produces = { "application/json" }
推荐阅读
- css - 用于 chrome 但不适用于 safari 的按钮的 CSS
- html - 如何在 XPath 中跳过他的一些父母来选择子元素
- laravel - 是否可以使用 Eloquent 和两个 hasMany 关系计算一个查询中的平均值
- c# - C# 许多长时间运行的任务并行
- javascript - 如何通过使用时刻减去两个日期来获得总小时数?
- ios - Xcode 10 生成的 Assets.car 比 Xcode 9 大?
- scala - 期货如何在 Akka 演员中执行
- c# - 从字符串到布尔值的 IValueConverter 转换错误
- vb.net - 在 vb.net 的水晶报表中显示查询参数
- javascript - url 响应无法在 React App 中映射