PactRunner忽略@DefaultRequestValues

时间:2018-04-18 15:48:32

标签: pact pact-jvm

我正在尝试测试我的第一个Pact文件,而且我一直在为生产者提出请求设置标题。

当向具有无效userId的用户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方法,永远不会设置授权标头,并且服务返回401(在这种情况下这是正确的行为,但这不是我想要测试的)。

有关如何在此测试中设置授权标头的任何想法?感谢。

1 个答案:

答案 0 :(得分:1)

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

我能给你的最好的例子是test that we have that tests this the default request values。您会注意到createFragment函数返回RequestResponsePact个对象。这是您要测试的相互作用,可以添加默认值。