jsonpath সহ সদস্যদের গণনা?


103

জসনপথ ব্যবহার করে সদস্য সংখ্যা গণনা করা সম্ভব?

স্প্রিং এমভিসি পরীক্ষা ব্যবহার করে আমি এমন একটি নিয়ামক যা পরীক্ষা করে তা পরীক্ষা করছি

{"foo": "oof", "bar": "rab"}

সঙ্গে

standaloneSetup(new FooController(fooService)).build()
            .perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
            .andExpect(jsonPath("$.foo").value("oof"))
            .andExpect(jsonPath("$.bar").value("rab"));

আমি নিশ্চিত করতে চাই যে উত্পন্ন জসনটিতে অন্য কোনও সদস্য উপস্থিত না রয়েছে। আশা করি তাদের জেসনপ্যাথ ব্যবহার করে গণনা করুন। এটা কি সম্ভব? বিকল্প সমাধানগুলিও স্বাগত।

উত্তর:


233

অ্যারের আকার পরীক্ষা করতে :jsonPath("$", hasSize(4))

অবজেক্টের সদস্যদের গণনা করতে :jsonPath("$.*", hasSize(4))


অর্থাত্ এপিআই 4 টি আইটেমের অ্যারে প্রদান করে তা পরীক্ষা করতে :

স্বীকৃত মান: [1,2,3,4]

mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$", hasSize(4)));

এপিআই পরীক্ষা করে দেখতে 2 সদস্যযুক্ত একটি বস্তুকে ফেরত দেয় :

স্বীকৃত মান: {"foo": "oof", "bar": "rab"}

mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$.*", hasSize(2)));

আমি হ্যামক্রেস্ট সংস্করণ 1.3 এবং স্প্রিং টেস্ট 3.2.5.RELEASE ব্যবহার করছি

hasSize (int) javadoc

দ্রষ্টব্য: আপনাকে হ্যামক্রাস্ট-লাইব্রেরি নির্ভরতা এবং import static org.hamcrest.Matchers.*;কাজ করার জন্য হ্যাসসাইজ () অন্তর্ভুক্ত করতে হবে।


2
@ ম্যাটটিবি - যদি মাভেন ব্যবহার করে থাকেন তবে নির্ভরতা hamcrest-allহিসাবে যুক্ত করবেন না , তবে ব্যবহার করুন hamcrest-library: কোড. google.com/p/hamcrest/wiki/HamcrestDistributables
অ্যাডাম

1
কেউ যদি আকারটি না জানে এবং এটি পেতে চায়?
zygimantus

2
@ মেনুকা-ইশান - আমি মনে করি না যে এটি অবহেলিত হয়েছে: মকএমভিসিআরসাল্টম্যাচার্স.জসনপ্যাথ () জাভাদোক
লোপিসান

@zygimantus সোর্স কোড বা ওয়েব ব্রাউজার বিকাশকারী সরঞ্জামগুলির প্রতিক্রিয়ার পরিদর্শন থেকে আপনার অবজেক্ট / অ্যারেতে সমস্ত ক্ষেত্রের আকার অবশ্যই গুনতে হবে।
cellepo

12

আপনি jsonpath এর ভিতরে থাকা পদ্ধতিগুলিও ব্যবহার করতে পারেন, পরিবর্তে

mockMvc.perform(get(API_URL))
   .andExpect(jsonPath("$.*", hasSize(2)));

আপনি করতে পারেন

mockMvc.perform(get(API_URL))
   .andExpect(jsonPath("$.length()", is(2)));

7

আমরা ব্যবহার করতে পারি JsonPath ফাংশন মত size()বা length()ভালো:

@Test
public void givenJson_whenGetLengthWithJsonPath_thenGetLength() {
    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";

    int length = JsonPath
        .parse(jsonString)
        .read("$.length()");

    assertThat(length).isEqualTo(3);
}

অথবা কেবলমাত্র পার্সিং net.minidev.json.JSONObjectকরে আকারটি পান:

@Test
public void givenJson_whenParseObject_thenGetSize() {
    String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}";

    JSONObject jsonObject = (JSONObject) JSONValue.parse(jsonString);

    assertThat(jsonObject)
        .size()
        .isEqualTo(3);
}

প্রকৃতপক্ষে, দ্বিতীয় পদ্ধতির প্রথমটির চেয়ে ভাল পারফরম্যান্স দেখায়। আমি একটি জেএমএইচ পারফরম্যান্স পরীক্ষা করেছি এবং আমি নিম্নলিখিত ফলাফলগুলি পেয়েছি:

| Benchmark                                       | Mode  | Cnt | Score       | Error        | Units |
|-------------------------------------------------|-------|-----|-------------|--------------|-------|
| JsonPathBenchmark.benchmarkJSONObjectParse      | thrpt | 5   | 3241471.044 | ±1718855.506 | ops/s |
| JsonPathBenchmark.benchmarkJsonPathObjectLength | thrpt | 5   | 1680492.243 | ±132492.697  | ops/s |

উদাহরণ কোডটি এখানে পাওয়া যাবে


4

আজ আমার সাথে এটি করা হয়েছে। এটি উপলভ্য প্রতিবেদনে প্রয়োগ করা হয়েছে বলে মনে হয় না। যাইহোক, একটি org.hamcrest.Matcherঅবজেক্টে পাস করার একটি পদ্ধতি রয়েছে । এটির সাহায্যে আপনি নীচের মতো কিছু করতে পারেন:

final int count = 4; // expected count

jsonPath("$").value(new BaseMatcher() {
    @Override
    public boolean matches(Object obj) {
        return obj instanceof JSONObject && ((JSONObject) obj).size() == count;
    }

    @Override
    public void describeTo(Description description) {
        // nothing for now
    }
})

0

যদি com.jayway.jsonassert.JsonAssertআপনার ক্লাসপথে না থাকে (যা আমার ক্ষেত্রে হয়েছিল), নিম্নলিখিত উপায়ে পরীক্ষা করা সম্ভাব্য কাজ হতে পারে:

assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());

[দ্রষ্টব্য: আমি ধরে নিয়েছি যে জসনের সামগ্রী সর্বদা একটি অ্যারে]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.