如何解决如何在Gradle中将契约验证结果发布给契约经纪人?
我有一个使用gradle(如果需要的话,位于底部的gradle文件)和junit5的Spring Boot构建的服务。关于stackoverflow的许多问题是针对maven和Junit4的,我很难翻译答案。我的契约生产者测试在经纪人的合同上运行并正确测试。但是,成功验证的结果不会发送到代理。 该怎么办?
该协定来自“其他服务”,并确认“我的服务”正确归还了三只可爱的猫。测试结果如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
auto *top1 = createItem("Images","/home/ui/qrc/laserscan.png");
auto *top2 = createItem("Path","/home/ui/qrc/laserscan.png");
top1->addChild(createItem("Original","/home/ui/qrc/laserscan.png"));
top1->addChild(createItem("Sample","/home/ui/qrc/laserscan.png"));
top2->addChild(createItem("Left Side","/home/ui/qrc/laserscan.png"));
top2->addChild(createItem("Right Side","/home/ui/qrc/laserscan.png"));
ui->treeWidget->addTopLevelItems({ top1,top2 });
ui->treeWidget->addTopLevelItems({ top1,top2 });
const int n_tops = ui->treeWidget->topLevelItemCount();
// Below I am assigning to each parent/children a checkBox
for(int a = 0; a<n_tops; ++a) {
const int n_children = ui->treeWidget->topLevelItem(a)->childCount();
qtreewidgetitem_assign_qcheckBox(ui->treeWidget,ui->treeWidget->topLevelItem(a));
for(int b = 0; b<n_children; ++b) {
qtreewidgetitem_assign_qcheckBox(ui->treeWidget,ui->treeWidget->topLevelItem(a)->child(b));
}
}
QTreeWidgetItem *parentItem = Q_NULLPTR;
QTreeWidgetItem *childItem = Q_NULLPTR;
QMapIterator<QString,QStringList> i(treeMap);
while (i.hasNext()) {
i.next();
parentItem = new QTreeWidgetItem(widget);
parentItem->setText(0,i.key());
foreach (const auto &str,i.value()) {
childItem = new QTreeWidgetItem;
childItem->setText(0,str);
parentItem->addChild(childItem);
}
}
}
运行QTreeWidget
时一切正常。测试通过,并且如果我将状态更改为只有2只猫,则测试将失败,因为该协定要求服务方退回3只猫。但是,契约经纪人未显示成功的验证。我该怎么办?
我已经尝试过,但似乎是错误的:
运行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
}
}
->“未配置服务提供商”。
不确定他需要服务提供商做什么,因为测试会提供所有必要的信息。但是在进行了一些糊涂之后,我出现了这个问题并将其添加到我的build.gradle中:
./gradlew pactTest pactPublish
不确定他为什么需要该信息,所有这些都已存在于Pact测试中。但至少它更改了./gradlew pactVerify
的输出,现在它列出了合同并尝试验证它仅因Pact {
broker {
pactbrokerUrl = "https://pact-broker.apps.home.io/"
pactbrokerUsername = "pact"
pactbrokerPassword = pactPassword
}
serviceProviders {
'my_service' {
fromPactbroker {
selectors = latestTags('SandBox')
}
}
}
}
而失败,这似乎是错误的方法,因为它不使用现有的Test所有。使用现有的./gradlew pactVerify
测试,我还不知道该怎么说。
与gradle文件相关的内容(我将答案从this question合并为无效):
Connect to localhost:8080 [localhost/127.0.0.1,localhost/0:0:0:0:0:0:0:1] Failed: Connection refused (Connection refused)
解决方法
您似乎正在将Gradle验证过程(./gradlew pactVerify
)与JUnit 1(例如OtherServiceContractVerifier
)混合使用。
两者都可以通过
进行配置有关gradle的信息,请参见https://docs.pact.io/implementation_guides/jvm/provider/gradle/#project-properties。
因此,设置以下内容将启用该功能(注意:您只能从CI发布)
System.setProperty("pact.verifier.publishResults","true");
使用JUnit的示例项目:https://github.com/pactflow/example-provider-springboot
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。