pact-foundation / pact-jvm

JVM version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
https://docs.pact.io
Apache License 2.0
1.08k stars 478 forks source link

AMQP Pact Consumer tests impossible to invoke method with annotation @PactVerifyProvider #1431

Open nicolasmingo opened 2 years ago

nicolasmingo commented 2 years ago

I'm using message pacts with AMQP feature. After generating pact files (JSON), I'm not able to use it inside Provider test.

Steps to reproduce:

  @ExtendWith ( PactVerificationInvocationContextProvider.class )
  @PactFolder("pacts")
  class MyProviderTest {

      @BeforeEach
      void before(PactVerificationContext context) {
          context.setTarget(new MessageTestTarget());
      }

      @TestTemplate
      void pactVerificationTestTemplate(PactVerificationContext context) {
          context.verifyInteraction();
      }

      @State("My Init state")
      public void initState() {
          // ...
      }

      @PactVerifyProvider("a success response")
      public static MessageAndMetadata verifySuccessResponse() {
          final Map<String, Object> metadata = new HashMap<>();
          final byte[] data = .... // my body
          return new MessageAndMetadata(data, metadata).toString();
      }

  }

Current behaviour 1.1) Failed to invoke provider method 'verifySuccessResponse'

Expected behaviour verifySuccessResponse should be invoked

Environment Gradle + Java 11 + IntelliJ + pact-jvm libraries: 'au.com.dius.pact.provider:junit5:4.2.10' 'au.com.dius.pact.consumer:junit5:4.2.10'

Analysis

    fun invokeProviderMethod(m: Method, instance: Any?): Any? {
        try {
          return m.invoke(instance)
        } catch (e: Throwable) {
          throw RuntimeException("Failed to invoke provider method '${m.name}'", e)
        }
    }

The invoke method failed: java.lang.IllegalAccessException: class au.com.dius.pact.provider.ProviderVerifier$Companion cannot access a member of class MyProviderTest.

If I set "m.setAccessible(true)" it will succeed.

nicolasmingo commented 2 years ago

The problem appears when the Test class is declared with private-package visibility, set it as public will solve the issue.

uglyog commented 2 years ago

4.1.27 released