PactRunner 忽略@DefaultRequestValues

PactRunner ignores @DefaultRequestValues

我正在尝试测试我的第一个 Pact 文件,但我一直坚持为向生产者提出的请求设置 headers。

当向具有无效用户 ID 的用户 API 发出请求时,我正在尝试获取 404,如以下 Pact 文件中所定义:

{
  "consumer": {
    "name": "ios-client"
  },
  "provider": {
    "name": "user-service"
  },
  "interactions": [
    {
      "description" : "Request for a User Id that does not exist should return 404",
      "provider_state": "User with id NOPE does not exist",
      "request": {
        "method": "GET",
        "path" : "/users/NOPE"
      },
      "response": {
        "status": 404,
        "body" : ""
      }
    }
  ]
}

失败的测试如下:

import au.com.dius.pact.consumer.DefaultRequestValues;
import au.com.dius.pact.consumer.dsl.PactDslRequestWithPath;
import au.com.dius.pact.consumer.dsl.PactDslRequestWithoutPath;
import au.com.dius.pact.provider.junit.PactRunner;
import au.com.dius.pact.provider.junit.Provider;
import au.com.dius.pact.provider.junit.State;
import au.com.dius.pact.provider.junit.loader.PactBroker;
import au.com.dius.pact.provider.junit.target.HttpTarget;
import au.com.dius.pact.provider.junit.target.Target;
import au.com.dius.pact.provider.junit.target.TestTarget;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.boot.SpringApplication;
import org.springframework.http.HttpHeaders;
import .....UserServiceApplication;
import .....UserControllerIT;

import java.util.HashMap;
import java.util.Map;

@RunWith(PactRunner.class)
@Provider("user-service")
@PactBroker(host="${pactbroker.hostname:localhost}", port = "80")
public class PactTest {

    @TestTarget
    public final Target target = new HttpTarget(8080);

    @DefaultRequestValues
    public void defaultRequestValues(PactDslRequestWithoutPath request) {
        Map<String, String> headers = new HashMap<>();
        headers.put(HttpHeaders.AUTHORIZATION, UserControllerIT.AUTH_TOKEN1);
        request.headers(headers);

        System.out.println("THIS IS NEVER CALLED");
    }

    @State("User with id NOPE does not exist")
    public void userWithIdNopeDoesNotExist_andServerRunning() {
        String[] args =  new String[1];
        args[0] = ""; //don't ask
        SpringApplication.run(UserServiceApplication.class, args);
    }

}

从未调用 defaultRequestValues 方法,从未设置授权 header,并且服务 returns 401(在这种情况下这是正确的行为,但这不是我要测试的).

关于如何在此测试中设置授权 header 的任何想法?谢谢

嗯,不,它不会 运行 因为你正在使用 @State 来 运行 你的 "test" 状态只用于设置 状态而不是运行你的测试代码。 Pact 需要一种能够拦截请求并将这些默认值添加到每个请求的方法,这就是为什么我们需要设置交互并将它们 return 添加到框架,以便将这些交互添加为默认值。

我能给你的最好的例子就是这个test that we have that tests this the default request values。您会注意到 createFragment 函数 return 是一个 RequestResponsePact 对象。这是您要测试的交互,其中添加了默认值。