首页 > 解决方案 > 如何使用 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));
    }

}

标签: springtestingjunit5providerpact

解决方案


1.1) header: Expected a header 'Content-Type' but was missing

此消息来自提供者端的响应验证。它告诉 pact 期望服务器返回Content-Type标头,但它没有。您的应用程序应该为此和测试进行调整,即@RestController

@RequestMapping(value = "/my/url", produces = { "application/json" }

推荐阅读