Java 如何向gradle的pact broker发布pact验证结果?

Java 如何向gradle的pact broker发布pact验证结果?,java,spring-boot,junit5,pact,Java,Spring Boot,Junit5,Pact,我有一个使用gradle(如果需要的话,在底部的gradle文件)和Junit5构建的springboot服务。关于stackoverflow的许多问题是针对maven和Junit4的,我在翻译答案时遇到困难。我的pact producer测试在代理上根据合同正确运行和测试。但是,成功验证的结果不会发送给代理要发生这种情况,我必须做些什么? 该协议来自“其他服务”,并验证“我的服务”是否正确返回三只可爱的猫。这是测试的样子: package com.miau.package; // impor

我有一个使用gradle(如果需要的话,在底部的gradle文件)和Junit5构建的springboot服务。关于stackoverflow的许多问题是针对maven和Junit4的,我在翻译答案时遇到困难。我的pact producer测试在代理上根据合同正确运行和测试。但是,成功验证的结果不会发送给代理要发生这种情况,我必须做些什么?

该协议来自“其他服务”,并验证“我的服务”是否正确返回三只可爱的猫。这是测试的样子:

package com.miau.package;

// imports

@Provider("my_service")
@Consumer("other_service")
@PactBroker(authentication = @PactBrokerAuth(username = "pact",
    password = "${pactPassword}"), //NOSONAR hardcoded password hint no password, just variable
    host = "pact-broker.apps.home.io/", port = "443",
    tags = "sandbox"
)
@SpringBootTest(classes = Application.class,
    properties = { "spring.profiles.active=pact,fake-oauth2", "pact.verifier.publishResults=true" },
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Tag("pact")
@ExtendWith({SpringExtension.class})
public class OtherServiceContractVerifier {

    @LocalServerPort
    int port;

    @Autowired
    Application application;

    @BeforeEach
    void before(PactVerificationContext context) {
        HttpTestTarget target = new HttpTestTarget("localhost", port, "/my_service");
        context.setTarget(target);
    }

    @TestTemplate
    @ExtendWith(PactVerificationInvocationContextProvider.class)
    void executePact(PactVerificationContext context) {
        context.verifyInteraction();
    }

    @State("3 cute cats exist")
    public void stateThreecuteCatsExists() {
        // make 3 cute cats exist in database
    }
}
运行
/gradlew pactTest pactPublish
时,一切正常。测试通过,如果我将状态更改为只有2只猫,测试将失败,因为契约要求服务返回3只猫。但是,pact经纪人未显示成功验证。我需要为此做些什么


我试过了,但似乎错了:

运行
/gradlew pactVerify
->“未配置任何服务提供商”。 不确定他需要服务提供商做什么,因为测试提供了所有必要的信息。但在谷歌搜索之后,我发现了这个,并将其添加到我的构建中。格雷德尔:

Pact {
broker {
    pactBrokerUrl = "https://pact-broker.apps.home.io/"
    pactBrokerUsername = "pact"
    pactBrokerPassword = pactPassword
}
serviceProviders {
    'my_service' {
        fromPactBroker {
            selectors = latestTags('Sandbox')
        }
    }
}
}
不确定他为什么需要这些信息,这些信息都已经存在于契约测试中了。但至少它更改了
/gradlew pactVerify
的输出,现在它列出了契约并尝试验证它,但失败的原因是
连接到本地主机:8080[localhost/127.0.0.1,localhost/0:0:0:0:0:1]失败:连接被拒绝(连接被拒绝)
这似乎是错误的方法,因为它根本不使用现有的测试。我还没有找到如何告诉它,如何使用现有的
OtherServiceContractVerifier
测试


gradle文件中与Pact相关的内容(我从中获得了答案,但没有结果):


您似乎将Gradle验证过程(
/gradlew pactVerify
)与JUnit-one(例如
其他ServiceContractVerifier
)混合在一起

两者都可以通过

对于gradle,请参见

让我看看

因此,设置以下内容将启用该功能(注意:您应该仅从CI发布)


使用JUnit的示例项目:

您似乎将Gradle验证过程(
/gradlew pactVerify
)与JUnit one(例如
其他ServiceContractVerifier
)混合在一起

两者都可以通过

对于gradle,请参见

让我看看

因此,设置以下内容将启用该功能(注意:您应该仅从CI发布)


使用JUnit的示例项目:

谢谢,在这样的代码中设置系统属性时,它可以正常工作。但是,当使用“-Ppact.verifier.publishResults=true”将其传递给gradle任务时,它不起作用。你知道解决这个问题的方法吗?对不起,我不知道。可能是一些特殊的事情。粗略地搜索我们的文档有一个类似的示例(请参见的底部)。谢谢,在这样的代码中设置系统属性时,它是有效的。但是,当使用“-Ppact.verifier.publishResults=true”将其传递给gradle任务时,它不起作用。你知道解决这个问题的方法吗?对不起,我不知道。可能是一些特殊的事情。粗略地搜索我们的文档有一个类似的例子(见下表)
{
    buildscript {
        if (!project.hasProperty('pactPassword')) {
            pactPassword = ''
        }
        if (!project.hasProperty('pactTags')) {
            pactTags = ''
        }
    }
}

plugins {
    id "au.com.dius.pact" version "4.1.7"
}

apply plugin: 'au.com.dius.pact'

task pactTest(type: Test) {
    environment "pactPassword", "$pactPassword"
    description = 'Runs pact tests.'
    group = 'verification'

    useJUnitPlatform()
    outputs.upToDateWhen { false }

    testClassesDirs = sourceSets.pactTest.output.classesDirs
    classpath = sourceSets.pactTest.runtimeClasspath
    shouldRunAfter test
}
check.dependsOn pactTest

dependencies {
    pactTestImplementation "au.com.dius:pact-jvm-consumer-junit5:4.0.10"
    pactTestImplementation "au.com.dius:pact-jvm-consumer-java8:4.0.10"
    pactTestImplementation "au.com.dius:pact-jvm-provider-junit5:4.0.10"
    pactTestImplementation "au.com.dius:pact-jvm-provider:4.0.10"
}

test {
    useJUnitPlatform {
        excludeTags "pact"
    }
}

pact {
    publish {
        pactBrokerUrl = "https://pact-broker.apps.home.io/"
        pactBrokerUsername = "pact"
        pactBrokerPassword = pactPassword
        tags = pactTags.tokenize(',')
    }
}
System.setProperty("pact.verifier.publishResults", "true");