тестирование фреймворк-функции ответа json - PullRequest
1 голос
/ 12 сентября 2011

У меня есть I контроллер с методом:

public static void softwares() {
   List<Software> list = new ArrayList<Software>();
   list.add(new Software("soft 1"));
   list.add(new Software("soft 2"));
   list.add(new Software("soft 3"));
   list.add(new Software("soft 4"));

   renderJSON(list);
}

У меня есть запись в / conf / маршруты, например: GET / my-server / softwares Application.softwares

У меня есть функциональный тест, который пытается проверить, правильно ли отвечает служба и возвращает ли она 4 элемента

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;    
...
@Test
public void softwaresShouldReturnSomething() throws Exception {

 Response response = GET("/myserver-server/softwares");

 assertNotNull(response); // this is OK
 assertIsOk(response); // this is OK

assertContentType("application/json", response); // this is OK
assertCharset("utf-8", response); // this is OK

 Document doc = Jsoup.parse(getContent(response));

 int fieldsPassedCount = doc.children().first().children().size();

 assertTrue(fieldsPassedCount == 4);

}

Когда я отлаживаю ее, переменная 'doc' имеет HTML со своими значениями, но я хочу иметь только JSON. Что я делаю неправильно? и мои поляPassedCount = 2 здесь!.

Вот так выглядит мой ответ в 'doc':

<code><html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">[{"name":"soft 1"},{"name":"soft 2"},{"name":"soft 3"},{"name":"soft 4"}]

Я попытался изменить свои настройки / маршруты следующим образом (добавив формат : 'json' )

GET     /my-server/softwares            Application.softwares(format:'json')

Итак, как бы вы написали этот тест?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Редактировать - тестирование с использованием объектов

Я рад, что вы нашли свой ответ.Вы также можете проверить полученный массив JSON, превратив данные обратно в объекты - это может выглядеть следующим образом:

@Test
public void softwaresShouldReturnSomething() throws Exception {

    Http.Response response = GET("/myserver-server/softwares");

    assertIsOk(response);
    assertContentType("application/json", response);
    assertCharset("utf-8", response);

    String content = getContent(response);
    Gson gson = new Gson();
    Type softwareType = new TypeToken<Collection<Softwares>>(){}.getType();
    List<Softwares> softwaresList = gson.fromJson( content, softwareType);

    assertEquals( softwaresList.size(), 4 );
}
1 голос
/ 12 сентября 2011

Способ, как это исправить, делает так:

1

public class ApplicationTest extends FunctionalTest {
...
String json = getContent(response).toString();

Итак, у нас есть простая строка json.

Тогда:

2. Использование: org.codehaus.jackson lib

ObjectMapper mapper = new ObjectMapper();
JsonNode firstNode = mapper.readTree(json);
int size = firstNode.size();

assertTrue(size == 4);
...