You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pact框架:如何在IntelliJ中单独运行单个Provider测试?

在IntelliJ中单独运行单个Pact Provider测试的方法

我用Pact编写了一个包含两个测试的Provider测试类,运行整个测试类时所有测试均可成功执行,但右键点击带有@State注解的方法尝试单独运行单个测试时,却提示未找到测试。请问如何在IntelliJ中单独运行单个Pact Provider测试?

Provider测试类

@consumer("teh_consumer")
@Provider("teh_provider")
@PactBroker
@IgnoreNoPactsToVerify
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//@SpringBootTest
public class TehAppContractTests {

@TestTarget
public final Target target = new SpringBootHttpTarget();

@State("Teh services are up")
public void testServicesUpRequest() {
}

@State("Teh services are down")
public void testServicesDownRequest() {
}
}

报错堆栈信息

java.lang.Exception: No tests found matching Method testServicesUpRequest(com.teh.contract.TehAppContractTests) from org.junit.internal.requests.ClassRequest@191e654

at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

解决方案

问题原因

带@State注解的方法并非标准JUnit测试方法(没有@Test注解),它们只是Pact用来在契约测试执行前设置对应环境状态的准备方法,无法直接被JUnit识别为可单独运行的测试用例。

方法一:通过VM参数过滤指定状态的契约测试

  1. 打开IntelliJ的Run/Debug Configurations
  2. 新建一个JUnit配置,测试类型选择Class,指定你的测试类TehAppContractTests
  3. 在VM options中添加参数,指定要运行的状态:
    -Dpact.provider.state="Teh services are up"
    
  4. 保存配置后运行,即可只执行对应状态的契约测试

方法二:添加JUnit测试方法手动触发指定契约验证

修改测试类,新增带@Test注解的方法,手动调用Pact的验证逻辑,这样就能右键单独运行这些方法:

@consumer("teh_consumer")
@Provider("teh_provider")
@PactBroker
@IgnoreNoPactsToVerify
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TehAppContractTests {

    @Autowired
    private WebApplicationContext context;

    private ProviderVerifier verifier;

    @BeforeEach
    void setup() {
        verifier = new ProviderVerifier();
        verifier.setTarget(new SpringBootHttpTarget(context));
    }

    @State("Teh services are up")
    public void testServicesUpRequest() {
    }

    @State("Teh services are down")
    public void testServicesDownRequest() {
    }

    @Test
    void verifyServicesUpContract() {
        verifier.verifyInteraction(new PactVerificationOptions()
                .providerState("Teh services are up")
                .consumer("teh_consumer"));
    }

    @Test
    void verifyServicesDownContract() {
        verifier.verifyInteraction(new PactVerificationOptions()
                .providerState("Teh services are down")
                .consumer("teh_consumer"));
    }
}

内容的提问来源于stack exchange,提问作者Dyptorden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:40:53