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参数过滤指定状态的契约测试
- 打开IntelliJ的Run/Debug Configurations
- 新建一个JUnit配置,测试类型选择
Class,指定你的测试类TehAppContractTests - 在VM options中添加参数,指定要运行的状态:
-Dpact.provider.state="Teh services are up" - 保存配置后运行,即可只执行对应状态的契约测试
方法二:添加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
相关产品推荐
相关产品推荐

