Выдача тестового модуля dropwizard UniformInterfaceException

1

Я знаю, что этот вопрос нужно было задавать тысячу раз раньше, но ни один из ответов в Stackoverflow не работает для меня. Я пытаюсь создать единичный тест для спокойного api, который использует базовую аутентификацию. Вот код для API:

@GET
@Timed
@Path("/getAuthPerson/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Person getAuthPerson(@PathParam("id")int id, @Auth Person user) {

    /* use HTTP header:
    Authorization : Basic dGVzdDpzZWNyZXQ=

    For negative test case, use
    Authorization : Basic dGVzdDoxMjM=
     */

    if(user.getName().isEmpty()) {
        return null;
    }

    Person p = new Person();
    p.setName("Test");
    p.setId(0);
    p.setAge(10);

    return p;
}

Этот API работает, когда я вызываю клиента RESTful из браузера, моей IDE или из Fiddler, т.е. Я правильно получаю 401, когда я не предоставляю заголовок/неправильный заголовок заголовка и могу вернуть ресурс, когда я предоставляю правильный заголовок. Однако аппаратный тест api отказывается работать, вот код для модульного теста:

public class PersonResourceTest {
private static final PersonDao personDao = mock(PersonDao.class);

@ClassRule
public static final ResourceTestRule resources = ResourceTestRule.builder()
        .addResource(new PersonResource(personDao))
        .build();

private static Person getDummyPerson() {
    Person person = new Person();
    person.setName("John Doe");
    person.setBirthDateTime(new DateTime("2012-11-21T13:01:33.568Z"));
    person.setAge(10);
    return person;
}

private final Person person = getDummyPerson();

@Before
public void setup() {
    when(personDao.getPerson(eq(123))).thenReturn(person);
    // we have to reset the mock after each test because of the
    // @ClassRule, or use a @Rule as mentioned below.
    reset(personDao);
}

@Test
public void authenticatedTestGetPositive() {
    PersonDao testDao = mock(PersonDaoMongoImpl.class);
    testDao.createPerson(person);

    WebResource.Builder builder = resources.client().resource("/persons/getAuthPerson/123").getRequestBuilder();
    builder.header("Authorization", "Basic dGVzdDpzZWNyZXQ=");
    //builder.header("Authorization", "Basic dGVzdDoxMjM=");
    builder.accept(MediaType.APPLICATION_JSON);

    Person p = builder.get(Person.class);
    assertThat(p).isEqualTo(person);
    verify(testDao).getPerson(123);
}

}

Единичный тест, который не требует аутентификации, отлично работает, однако этот тест проверки подлинности дает эту ошибку:

    ERROR [2014-08-10 14:48:58,108] com.sun.jersey.spi.container.ContainerRequest: A message body reader for Java class com.rms.pilotapi.core.Person, and Java type class com.rms.pilotapi.core.Person, and MIME media type application/octet-stream was not found.
The registered message body readers compatible with the MIME media type are:
    */* ->
      com.sun.jersey.core.impl.provider.entity.FormProvider
      com.sun.jersey.core.impl.provider.entity.StringProvider
      com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
      --snipped---
  • 1
    Я решил эту проблему, добавив addProvider(new BasicAuthProvider<>(new BasicAuthenticator(), "TestAuthenticator")) в строку @ClassRule .
Теги:
junit
rest
jersey
dropwizard

1 ответ

2
Лучший ответ

Вам необходимо зарегистрировать свой PersonAuthenticator (или PersonAuthenticator имя, которое вы использовали для вашего Authenticator) в JUnit testrule (@ClassRule).

Проблема в том, что Джерси пытается десериализовать пользователя параметра @Auth Person user, который должен обрабатываться вашим аутентификатором.

  • 0
    Привет @phXql спасибо за ваш ответ, еще один (очень глупый) вопрос, как мне зарегистрировать аутентификатор в @ClassRule , я очень новичок в этом и не могу понять это.
  • 0
    Я отмечаю это как ответ, потому что я заметил, что у новой платформы Джерси (2.0+) действительно есть метод register() для Client . Тем не менее, dropwizard по-прежнему использует v1.8, который не имеет этого метода. Можете ли вы предложить что-то для 1,8? 0
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню