pact-jvm icon indicating copy to clipboard operation
pact-jvm copied to clipboard

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

Open nicolasmingo opened this issue 4 years ago • 2 comments

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 avatar Sep 06 '21 16:09 nicolasmingo

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

nicolasmingo avatar Sep 07 '21 06:09 nicolasmingo

4.1.27 released

uglyog avatar Sep 19 '21 01:09 uglyog