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
对象。这是您要测试的交互,其中添加了默认值。
我正在尝试测试我的第一个 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
对象。这是您要测试的交互,其中添加了默认值。