Пустое тело ответа на сообщение, будьте уверены

Я использую restassured с junit4. В моем методе тестирования я создаю объект в mongodb, и когда я запускаю тест, он также успешно сохраняется. Но мне нужно сохранить созданный идентификатор, поэтому я пытаюсь получить тело ответа. Но response.getBody().asString() пуст.

@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");
}

Когда я вызываю остальную конечную точку извне, она возвращает тело ответа также с соответствующими полями, поэтому проблем с остальным API нет.

Если нет ответа на вышеупомянутый вопрос, то как бы вы, ребята, протестировали сообщение с возвращаемым телом, не сомневайтесь, чтобы я мог попробовать это.

Мой метод контроллера выглядит так:

 @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);
 }

person Harshana    schedule 14.08.2015    source источник


Ответы (3)


Мы используем другой ват для вызова служб с RestAssured. Однако, если вы получите пустую строку, вы можете отладить, была ли вызвана ваша служба, используя .peek().

Вы можете использовать этот тест:

@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);
}
person Federico Piazza    schedule 17.08.2015
comment
Спасибо. Я пытаюсь использовать это. Если я запускаю со второй строкой тела, в нем говорится, что в ответе не был определен тип содержимого. Итак, я снова добавляю тип контента как .then (). StatusCode (201) .contentType (application / json) .body (assignmentId, equalTo (testid123)), но он говорит, что application / json не соответствует фактическому типу контента. Любая подсказка, в чем причина? В моем контроллере остальные api создают и используют атрибуты, также определенные как json. Я обновил свой вопрос, чтобы показать, как выглядит api контроллера. - person Harshana; 18.08.2015
comment
Также, когда я проверяю до peek (), я вижу, что контент равен нулю и contentType = - person Harshana; 18.08.2015
comment
@Harshana Я подозреваю, что ваш контроллер плохо настроен. Если заданы неправильные заголовки, он может генерировать xml вместо json, возможно, вам также потребуется настроить заголовок Accept как json. Кроме того, я заметил, что используйте имя константы без класса, которое вы можете использовать явно produces=MediaType.APPLICATION_JSON_VALUE. Кроме того, перед использованием RestAssured для подключения к вашей службе убедитесь, что вы можете подключиться к своему контроллеру с помощью другого клиента, такого как Postman, и как только вы подтвердите, что он работает, перейдите к RestAssured. - person Federico Piazza; 18.08.2015

Именно здесь проявляется REST-Assured, его свободный интерфейс очень помогает найти правильный метод для использования. Если вы используете Spring Boot, тест должен работать без добавления зависимостей или конфигурации (за исключением, конечно, гарантированного спокойствия :)

Пример контроллера

@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);
    }
}

и протестировать:

@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);
    }
}
person mzc    schedule 17.08.2015

Вы можете попробовать метод log (). All (), чтобы проверить содержимое ответа. Следующий фрагмент cide может вам помочь.

@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");
   }
person Nitin Pawar    schedule 28.03.2017