Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在PACT测试中需要单元测试?_Java_Pact - Fatal编程技术网

Java 为什么在PACT测试中需要单元测试?

Java 为什么在PACT测试中需要单元测试?,java,pact,Java,Pact,最近,我已经熟悉了PACT测试。为每个交易对手剔除生产者/消费者的想法真是太酷了。然而,我不理解一个核心原则。在客户端PACT测试中,生成PACT json文件的那一个-为什么我需要启动测试服务器并使用特定的请求来访问它 例如,我有一个制作人叫A,我有一个消费者叫B。生产者A具有端点getAllUsers,该端点将返回所有用户的json。 在消费者B中,我编写了pact测试: @ExtendWith(PactConsumerTestExt.class) @PactTestFor(provider

最近,我已经熟悉了PACT测试。为每个交易对手剔除生产者/消费者的想法真是太酷了。然而,我不理解一个核心原则。在客户端PACT测试中,生成PACT json文件的那一个-为什么我需要启动测试服务器并使用特定的请求来访问它

例如,我有一个制作人叫A,我有一个消费者叫B。生产者A具有端点getAllUsers,该端点将返回所有用户的json。 在消费者B中,我编写了pact测试:

@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "ProducerA", port = "1234")
public class ProducerAPactTest {

    private static JSONArray body = new JSONArray("[ {'user_id': '1' }]");

    @Pact(provider = "ProducerA", consumer = "ConsumerB")
    RequestResponsePact createPact(PactDslWithProvider builder) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", ContentType.APPLICATION_JSON.toString());

        DslPart regionDsl = PactDslJsonArray.arrayEachLike()
            .stringType("id", "1").closeObject().closeArray();

        return builder.given("Normal state")
            .uponReceiving("Get all users request")
            .path("/users").method("GET").willRespondWith()
            .status(200).headers(headers).body(regionDsl).toPact();
    }

    @Test
    void runTest() {
        // when
        ResponseEntity<String> response = new RestTemplate()
            .getForEntity(mockServer.getUrl() + "/users", String.class);
        // then
        assertThat(response.getStatusCode().value()).isEqualTo(200);
        List<String> contentTypeHeaders = response.getHeaders().get("Content-Type");
        String responseBody = response.getBody();
        assertThat(contentTypeHeaders).isNotNull();
        assertThat(responseBody).isNotNull();
        assertThat(contentTypeHeaders.get(0)).isEqualTo(ContentType.APPLICATION_JSON.toString());
        JSONAssert.assertEquals(responseBody, body, JSONCompareMode.LENIENT);
    }
@ExtendWith(PactConsumerTestExt.class)
@包装(providerName=“ProducerA”,port=“1234”)
公共类产品性能测试{
私有静态JSONArray body=newjsonarray(“[{'user\u id':'1'}]”);
@契约(provider=“ProducerA”,consumer=“ConsumerB”)
RequestResponsePact createPact(PactDslWithProvider builder){
Map headers=newhashmap();
headers.put(“Content-Type”,ContentType.APPLICATION_JSON.toString());
DslPart regionDsl=PactDslJsonArray.arrayEachLike()
.stringType(“id”,“1”).closeObject().closeArray();
返回生成器。给定(“正常状态”)
.uponReceiving(“获取所有用户请求”)
.path(“/users”).method(“GET”).willRespondWith()
.status(200).headers(headers).body(regionDsl.toPact();
}
@试验
void runTest(){
//什么时候
ResponseEntity response=新RestTemplate()
.getForEntity(mockServer.getUrl()+“/users”,String.class);
//然后
断言(response.getStatusCode().value()).isEqualTo(200);
List contentTypeHeaders=response.getHeaders().get(“内容类型”);
字符串responseBody=response.getBody();
assertThat(contentTypeHeaders).isNotNull();
assertThat(responseBody).isNotNull();
assertThat(contentTypeHeaders.get(0)).isEqualTo(ContentType.APPLICATION_JSON.toString());
JSONAssert.assertEquals(响应主体、主体、JSONCompareMode.LENTIENT);
}

我曾经编写过pact测试。我是在Java下开发的,但我的问题通常代表所有pact测试。为什么我需要创建一个单元测试?对我来说,断言我收到的东西似乎毫无意义,因为我在上面几行就定义了我自己。我注意到所有pact消费者测试都遵循相同的模式。我是什么我缺少?

通常,被测试的类不仅仅是反序列化JSON主体。很抱歉,这是一个Ruby示例而不是java示例,但下面是一个客户端类示例,它将JSON文档转换为表示资源的模型:


我们在这里使用a来检查它在不同http响应中的行为(例如,它将404转换为null)。如果您只是直接测试HTTP响应,那么除了与提供商签订合同外,您的消费代码根本没有什么价值。

是否有一些东西是您无法通过pact测试检查的,但可以通过单元测试检查的?这正是我需要的-只需生成pact测试即可。这可能吗?目前如果我删除了单元测试,它失败了,错误消息说端点未命中。生成pact测试违背了使用pact测试的目的。请阅读此内容(如果您不熟悉pact,请阅读FAQ和文档页面的其余部分-它应该可以回答您的大多数问题):