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)'");
}
}