我正在尝试测试我的第一个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(在这种情况下这是正确的行为,但这不是我想要测试的)。
有关如何在此测试中设置授权标头的任何想法?感谢。
答案 0 :(得分:1)
嗯,不,它不会运行,因为你正在使用@State来运行你的“测试”,其中状态只是设置状态而不是运行你的测试代码。 Pact需要一种方法来拦截请求并将这些默认值添加到每个请求中,这就是为什么我们需要设置交互并将它们返回到框架,以便将这些交互添加为默认值。
我能给你的最好的例子是test that we have that tests this the default request values。您会注意到createFragment
函数返回RequestResponsePact
个对象。这是您要测试的相互作用,可以添加默认值。