create dummy SearchResponse instance for ElasticSearch test case

13,026

Solution 1

This will do what you want:

SearchShardTarget shardTarget = new SearchShardTarget("1", "monitoring", 1);
ShardSearchFailure[] shardFailures = new ShardSearchFailure[0];
float score = 0.2345f;

BytesReference source = new BytesArray("{\"@timestamp\":\"2014-08-20T15:43:20.762Z\",\"category_name\""
        + ":\"cat1111\",\"alert_message\":\"the new cpu threshold has been reached 80%\",\"alert_type\":"
        + "\"Critical\",\"view_mode\":\"unread\"}");

InternalSearchHit hit = new InternalSearchHit(1, "5YmRf-6OTvelt29V5dphmw", new StringText("quota-management"),
        null);
hit.shardTarget(shardTarget);
hit.sourceRef(source);
hit.score(score);

InternalSearchHit[] hits = new InternalSearchHit[]{hit}; 
InternalSearchHits internalSearchHits = new InternalSearchHits(hits, 28, score);
InternalSearchResponse internalSearchResponse = new InternalSearchResponse(internalSearchHits, null, null,
      null, false);

SearchResponse searchResponse = new SearchResponse(internalSearchResponse, "scrollId", 1, 1, 1000, 
        shardFailures);

If you call toString() on searchResponse it returns:

{
    "_scroll_id" : "scrollId",
    "took" : 1000,
    "timed_out" : false,
    "_shards" : {
        "total" : 1,
        "successful" : 1,
        "failed" : 0
    },
    "hits" : {
        "total" : 28,
        "max_score" : 0.2345,
        "hits" : [ {
            "_index" : "monitoring",
            "_type" : "quota-management",
            "_id" : "5YmRf-6OTvelt29V5dphmw",
            "_score" : 0.2345,
            "_source":{"@timestamp":"2014-08-20T15:43:20.762Z","category_name":"cat1111","alert_message":"the new cpu threshold has been reached 80%","alert_type":"Critical","view_mode":"unread"}
        } ]
    }
}

Solution 2

It works for me in ElasticsearchS 6.5

BytesReference source = new BytesArray(
            "{your json response come here}" );
    SearchHit hit = new SearchHit( 1 );
    hit.sourceRef( source );
    SearchHits hits = new SearchHits( new SearchHit[] { hit }, 5, 10 );
    SearchResponseSections searchResponseSections = new SearchResponseSections( hits, null, null, false, null, null, 5 );
    SearchResponse searchResponse = new SearchResponse( searchResponseSections, null, 8, 8, 0, 8, new ShardSearchFailure[] {} );
    return searchResponse;
Share:
13,026
bagui
Author by

bagui

Updated on July 25, 2022

Comments

  • bagui
    bagui almost 2 years

    I'm trying to create a dummy SearchResponse object by passing the values manually to the constructor. I have a JUnit test class for which I'm using this dummy value to mock the actual method call. Trying with the below method to

    public SearchResponse actionGet() throws ElasticsearchException {
        ShardSearchFailure[] shardFailures = new ShardSearchFailure[0];
        int docId = 0;
        String id = "5YmRf-6OTvelt29V5dphmw";
        Map<String, SearchHitField> fields = null;
    
        InternalSearchHit internalSearchHit = new InternalSearchHit(docId, id,
                null, fields);
        InternalSearchHit[] internalSearchHit1 = { internalSearchHit };
    
        InternalSearchResponse EMPTY = new InternalSearchResponse(
                new InternalSearchHits(internalSearchHit1, 0, 0), null, null,
                null, false);
        SearchResponse searchResponse = new SearchResponse(EMPTY, "scrollId",
                1, 1, 1000, shardFailures);
        return searchResponse;
    }
    

    and here is my actual value of json when query directly to elasticsearch.

    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 3,
        "successful": 3,
        "failed": 0
      },
      "hits": {
        "total": 28,
        "max_score": null,
        "hits": [
          {
            "_index": "monitoring",
            "_type": "quota-management",
            "_id": "5YmRf-6OTvelt29V5dphmw",
            "_score": null,
            "_source": {
              "@timestamp": "2014-08-20T15:43:20.762Z",
              "category_name": "cat1111",
              "alert_message": "the new cpu threshold has been reached 80%",
              "alert_type": "Critical",
              "view_mode": "unread"
            },
            "sort": [
              1408549226173
            ]
          }
        ]
      }
    }
    

    I want to create similar kind of response by creating the actual SearchResponse Object. But I couldn't find any way to send the values in InternalSearchHit[]. Please let me know how can I do this.

  • Jonathan
    Jonathan over 7 years
    What about mocking a InternalAggregation?
  • Raghuveer
    Raghuveer over 5 years
    This looks very old answer I am using 6.3.2 API can you please suggest a way please ?
  • Krishna Gangaraju
    Krishna Gangaraju almost 5 years
    how about aggregations ?
  • technocrat
    technocrat almost 5 years
    Aggregations are solved! See the answer here: stackoverflow.com/questions/49798654/…
  • technocrat
    technocrat almost 5 years
    Aggregations are solved! See the answer here: stackoverflow.com/questions/49798654/…