2015-08-14 8 views
5

Ich benutze Restassured mit Junit4. In meiner Testmethode erstelle ich ein Objekt in mongodb und wenn ich den Test ausführe, bleibt es erfolgreich bestehen. Aber ich muss die ID speichern, die erstellt wird, also versuche ich, den Antwortkörper zu erhalten. Aber die response.getBody().asString() ist leer.Leere Antwort Körper für Post mit Ruhe versichert

@Test 
public void testA() throws JSONException { 

    Map<String,Object> createVideoAssignmentParm = new HashMap<String,Object>(); 
    createVideoAssignmentParm.put("test1", "123"); 

    Response response = expect().statusCode(201).when().given().contentType("application/json;charset=UTF-8") 
      .headers(createVideoAssignmentParm).body(assignment).post("videoAssignments"); 
    JSONObject jsonObject = new JSONObject(response.getBody().asString()); 
    id= (String)jsonObject.getString("assignmentId"); 
} 

Wenn i den Rest Endpunkt extern aufrufen, es gibt die Antwort Körper auch mit den entsprechenden Feldern also kein Problem mit dem Rest API.

Wenn keine Antwort für obige Frage dann, wie würden Sie einen Beitrag mit Rückkehr Körper mit Ruhe getestet testen, so dass ich es so versuchen kann.

Mein Controller-Methode aussieht,

@RequestMapping(value = "/videoAssignment", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE, method = RequestMethod.POST) 
@ResponseBody 
public HttpEntity<VideoAssignment> createVideoAssingnment(
    //@ApiParam are there..){ 

    //other methods 
    return new ResponseEntity<>(va, HttpStatus.CREATED); 
} 

Antwort

4

Wir Verwenden Sie einen anderen Wat, um Dienste mit RestAssured aufzurufen. Wenn Sie jedoch eine leere Zeichenfolge erhalten, können Sie mithilfe von .peek() debuggen, ob Ihr Dienst aufgerufen wurde oder nicht.

können Sie diesen Test.

@Test 
public void testStatus() 
{ 
    String response = 
      given() 
       .contentType("application/json") 
       .body(assignment) 
      .when() 
       .post("videoAssignments") 
       .peek() // Use peek() to print the ouput 
      .then() 
       .statusCode(201) // check http status code 
       .body("assignmentId", equalTo("584")) // whatever id you want 
      .extract() 
       .asString(); 

    assertNotNull(response); 
} 
+0

Danke. Ich versuche das zu benutzen. Wenn ich mit der zweiten Körperlinie arbeite, heißt es: "In der Antwort wurde kein Inhaltstyp definiert". Dann füge ich den Inhaltstyp erneut als .then() hinzu. StatusCode (201) .contentType ("application/json") .body ("assignmentId", equalTo ("testid123")) aber es heißt, application/json "doesn ' t passen tatsächlichen Inhalt-Typ.Jede Ahnung, was der Grund? In meinem Controller der Rest api produziert und konsumiert Attribute auch als JSON definiert.Ich habe meine Frage zu aktualisieren, um zu zeigen, wie die Controller-API auch aussieht.Auch – Harshana

+0

Auch noch, wenn ich zu prüfen bis peek(), ich kann sehen, der Inhalt ist null und contentType = "" – Harshana

+0

@Harshana Ich vermute, dass Ihr Controller nicht gut konfiguriert ist. Es könnte XML anstelle von JSON generieren, wenn falsche Header gesetzt sind, müssen Sie möglicherweise einrichten "Accept" Header als JSON auch Außerdem habe ich festgestellt, verwenden Sie den Namen ohne Klasse verwenden können Sie explizit 'produces = MediaType.APPLICATION_JSON_VALUE'. Zusätzlich vor der Verwendung von RestAssured Um eine Verbindung zu Ihrem Dienst herzustellen, stellen Sie sicher, dass Sie Ihren Controller mit einem anderen Client wie Postman erreichen können. Sobald Sie bestätigen, dass es funktioniert, wechseln Sie zu RestAssured –

1

Hier REST-Assured glänzt, seine Fluent Interface sehr hilfreich ist die richtige Methode zur Lokalisierung zu verwenden. Wenn Sie Frühlings-Boot verwenden, sollten Test arbeiten, ohne Abhängigkeiten oder Konfiguration hinzugefügt (außer Ruhesicher, natürlich :)

Beispiel Controller

@RestController 
@RequestMapping("/api") 
public class Endpoints { 

    public static class Assignment { 
     public int id = 1; 
     public String name = "Example assignment"; 
    } 

    @RequestMapping(value = "/example", 
      method = RequestMethod.POST, 
      produces = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<Assignment> example(@RequestBody Assignment assignment) { 
     return ResponseEntity.created(URI.create("/example/1")) 
       .body(assignment); 
    } 
} 

und Test:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
@IntegrationTest("server.port:0") 
public class EndpointsTest { 

    @Autowired 
    private ObjectMapper objectMapper; 

    @Value("${local.server.port}") 
    private int port; 

    @Before 
    public void setUp() { 
     RestAssured.port = port; 
    } 

    @Test 
    public void exampleTest() throws Exception { 

     Endpoints.Assignment assignment = 
      given() 
      .contentType(ContentType.JSON) 
      .body(objectMapper.writeValueAsBytes(new Endpoints.Assignment())) 
     .when() 
      .post("/api/example") 
      .then().statusCode(HttpStatus.SC_CREATED) 
      .extract().response() 
      .as(Endpoints.Assignment.class); 

     // We can now save the assignment.id 
     assertEquals(1, assignment.id); 
    } 
} 
0

Sie können versuchen,() zu protokollieren alle() -Methode Inhalt des Antwort.Verfahren folgenden cide Schnipsel zu überprüfen, kann Ihnen helfen.

@Test 
public void test(){ 
Map<String,Object> createVideoAssignmentParm = new HashMap<String,Object>(); 
createVideoAssignmentParm.put("test1", "123"); 
Response response=given() 
     .spec(request) 
     .contentType(ContentType.JSON) 
     .body(assignment) 
     .post("videoAssignments"); 

     response.then() 
     .statusCode(201).log().all(); 

     assignmentId=response.path("assignmentId"); 
    } 
Verwandte Themen