0

I am trying to migrate my pact consumer tests from jUnit4 to jUnit5. I've run across a problem with @DefaultRequestValues annotation, which is missing in pact-jvm-consumer-junit5.

In jUnit4 I was using it as follows:

@DefaultRequestValues
def defaultRequestValues(request: PactDslRequestWithoutPath): Unit = {
  request
    .method("POST")
    .headers(
      HttpHeaders.CONTENT_TYPE, APPLICATION_JSON.getMimeType,
      HttpHeaders.AUTHORIZATION, s"$TokenType $ValidToken",
    )
}

What is the recommended equivalent in pact-jvm-consumer-junit5?

Lesiak
  • 22,088
  • 2
  • 41
  • 65

1 Answers1

0

I used following code:

def setDefaultRequestValues(builder: PactDslWithProvider): Unit = {
  val defaults = builder.uponReceiving("defaults")
  defaultRequestValues(defaults)
  builder.setDefaultRequestValues(defaults)
}

def defaultRequestValues(request: PactDslRequestWithoutPath): Unit = {
  request
    .method("POST")
    .headers(
      HttpHeaders.CONTENT_TYPE, APPLICATION_JSON.getMimeType,
      HttpHeaders.AUTHORIZATION, s"$TokenType $ValidToken",
    )
}

I call setDefaultRequestValues as a first statement of each @Pact annotated method.

I arrived at this solution by looking at jUnit4 implelentation in BaseProviderRule

protected Map<String, BasePact> getPacts(String fragment) {
  if (pacts == null) {
    pacts = new HashMap<>();
    for (Method m: target.getClass().getMethods()) {
      if (JUnitTestSupport.conformsToSignature(m, config.getPactVersion()) && methodMatchesFragment(m, fragment)) {
        Pact pactAnnotation = m.getAnnotation(Pact.class);
        String provider = ep.parseExpression(pactAnnotation.provider(), DataType.RAW).toString();
        if (StringUtils.isEmpty(provider) || this.provider.equals(provider)) {
          PactDslWithProvider dslBuilder = ConsumerPactBuilder.consumer(
              ep.parseExpression(pactAnnotation.consumer(), DataType.RAW).toString())
            .pactSpecVersion(config.getPactVersion())
            .hasPactWith(this.provider);
          updateAnyDefaultValues(dslBuilder);
          try {
            BasePact pact = (BasePact) m.invoke(target, dslBuilder);
            pacts.put(this.provider, pact);
          } catch (Exception e) {
              throw new RuntimeException("Failed to invoke pact method", e);
          }
        }
      }
    }
  }
  return pacts;
}

private void updateAnyDefaultValues(PactDslWithProvider dslBuilder) {
  for (Method m: target.getClass().getMethods()) {
    if (m.isAnnotationPresent(DefaultRequestValues.class)) {
      setupDefaultRequestValues(dslBuilder, m);
    } else if (m.isAnnotationPresent(DefaultResponseValues.class)) {
      setupDefaultResponseValues(dslBuilder, m);
    }
  }
}

private void setupDefaultRequestValues(PactDslWithProvider dslBuilder, Method m) {
  if (m.getParameterTypes().length == 1
    && m.getParameterTypes()[0].isAssignableFrom(PactDslRequestWithoutPath.class)) {
    PactDslRequestWithoutPath defaults = dslBuilder.uponReceiving("defaults");
    try {
      m.invoke(target, defaults);
    } catch (IllegalAccessException| InvocationTargetException e) {
      throw new RuntimeException("Failed to invoke default request method", e);
    }
    dslBuilder.setDefaultRequestValues(defaults);
  } else {
    throw new UnsupportedOperationException("Method " + m.getName() +
      " does not conform required method signature 'public void " + m.getName() +
      "(PactDslRequestWithoutPath defaultRequest)'");
  }
}
Lesiak
  • 22,088
  • 2
  • 41
  • 65