Jersey Test Framework — определение ответа на ошибку по умолчанию для всех неизвестных путей в гризли

Чтобы протестировать наш API, который подключается к API графа facebook, мы используем фиктивную настройку сервера на основе Jersey Test Framework и grizzly:

@Path("/" + PostRest.RESOURCE)
@Produces("application/json")
public class PostRest {

    public static final String RESOURCE = "111_222";

    @GET
    public Response getPost(@QueryParam("access_token") String access_token) {
        if (access_token != VALID_TOKEN) {
            return Response.status(400).entity(createErrorJson()).build();
        }
        return Response.status(200).entity(createSomeJsonString()).build();
    }

Теперь, когда я могу реагировать на недопустимый или отсутствующий access_token правильным ответом об ошибке, я также хочу проверить, правильно ли реагирует мой API при попытке доступа к неизвестному ресурсу в facebook, т. е. к неизвестному пути.

Прямо сейчас я получаю 404 от моего гризли, очевидно, если я пытаюсь получить доступ, скажем, «/111_2», но Facebook, кажется, перехватывает эту ошибку и заключает ее в ответ Json, содержащий строку "false" с статусом 200.

Итак... Как настроить Test Framework для возврата

Response.status(200).entity("false").build();

каждый раз, когда он вызывается для известного пути?

Основной пример:

@ContextConfiguration({ "classpath:context-test.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest extends JerseyTest {

    @Inject
    private SomeConnection connection;

    private String unkownId = "something";


    public SomeTest() throws Exception {
        super("jsonp", "", "com.packagename.something");
    }


    @Test(expected = NotFoundException.class)
    public void testUnkownObjectResponse() throws NotFoundException {
        // here it should NOT result in a 404 but a JSON wrapped error response 
        // which will be handled by the Connection class and 
        // result in a custom exception 
        connection.getObject(unkownId);
    }

Или, может быть, я могу настроить гризли так, чтобы он вел себя так, как хотелось бы...?!

Спасибо!


person Pete    schedule 13.04.2012    source источник


Ответы (1)


Очевидно, у facebook есть собственный сервис для перехвата ошибок. То же самое должно быть сделано в вашем коде. Просто предоставьте свой собственный тестовый сервис, который перехватывает все запросы

@Path("/test/errorTrap")
public class ErrorTrapService{
 ....
}

Эта служба будет производить любой ответ, который вы хотите. Таким образом, любые несуществующие страницы, такие как http://mytest/test/errorTrap/111_2, будут перехвачены тестом. обслуживать и производить ожидаемый ответ для вас

person Dewfy    schedule 22.04.2012
comment
Итак, ваше решение предполагает, что я создаю просто еще один ресурс, который будет давать желаемый ответ, и получаю к нему доступ в одном из моих тестов? Что в значительной степени означает создать известный ресурс и назвать его неизвестным? Я сначала так и планировал.. Но твоя мысль о разоблачении натолкнула меня на мысль. Я мог бы попытаться перехватить цепочку фильтров гризли, проверить, можно ли перенаправить вызов на существующий ресурс, и если нет, то перенаправить его в местоположение по умолчанию, что затем приведет к желаемой ошибке... Я обновлю этот пост с окончательным результатом для всех, кто заинтересован. Спасибо! - person Pete; 23.04.2012
comment
@Pete выдаст желаемый ответ и получит к нему доступ в одном из моих тестов? - да ты понял! Пожалуйста. - person Dewfy; 23.04.2012