Junt 5 не может преобразовать параметр в метод

У меня есть простой тест для конечной точки в Интернете, и я тестирую схему json, используя restAssured. Я продолжаю получать:

org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [java.lang.String arg0] in method [void People.init(java.lang.String,java.lang.String)].

Я прочитал руководство JUnit 5 и действительно не понимаю эту ошибку. Насколько я вижу, нет ничего плохого во входных строках метода init. Я действительно не понимаю эту ошибку. Может ли кто-нибудь объяснить мне, что вызывает эту ошибку и как ее обойти в этом контексте?

import Utils;
import org.junit.jupiter.api.*;
import org.springframework.test.context.TestPropertySource;
import static io.restassured.RestAssured.get;
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;

@DisplayName(value = "Tests endpoint")
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestPropertySource(locations = "classpath:resources")

class People {

private String PEOPLE_QUERY = "PeopleQStar.json";
private String host = "http://dev-dev/";
private String endPoint = "people";

Utils utils = new Utils();

@BeforeAll
void init(String host, String endPoint)
{
    utils.setHostAndPath(host, endPoint);
    utils.setCommonSettings();
}

@AfterAll
void cleanUp()
{
    utils.tearDown();
}

@Order(1)
@DisplayName("Check if endpoint is up")
@Test
void initialComCheck()
{
    get().then().statusCode(200);
}

@Order(2)
@Test
public void givenUrl_whenJsonResponseConformsToSchema_thenCorrect() {

    get("?q=*").then().assertThat()
            .body(matchesJsonSchemaInClasspath(PEOPLE_QUERY));
}
}

Вам действительно нужно параметризовать init()? junit.org/junit5/docs/current/user-guide/…

Arho Huttunen 28.05.2019 05:40

@ArhoHuttunen Мне действительно не нужно, но я сделаю это для многих конечных точек. Не могли бы вы объяснить, что происходит? Я не думаю, что полностью понимаю документ.

Shejo284 28.05.2019 09:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
9 318
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрите следующие изменения в вашем коде:

import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
//... other imports and annotations
@ExtendWith(CustomParameterResolver.class) // your custom parameter resolver, see below
class People {

//...

  @BeforeAll
  void init(Server server) // custom stub for storage of your params
  {
    utils.setHostAndPath(server.getHost(), server.getEndpoint());
    utils.setCommonSettings();
  }

  // other methods as it is
}

  static class Server {
    private String host = "http://dev-dev/";
    private String endpoint = "people";

    public String getHost() {
      return host;
    }

    public String getEndpoint() {
      return endpoint;
    }
  }

  static class CustomParameterResolver implements ParameterResolver {

    @Override
    public boolean supportsParameter(ParameterContext parameterContext,
        ExtensionContext extensionContext) throws ParameterResolutionException {
      return (parameterContext.getParameter().getType() == Server.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext,
        ExtensionContext extensionContext) throws ParameterResolutionException {
      return new Server();
    }
  }

Это должно помочь решить вашу проблему. Основная проблема в вашем случае - это @BeforeAll сигнатура метода по умолчанию (без параметров). Вот почему вы получаете исключение (потому что оно не знает о каких-либо настраиваемых параметрах, которые вы пытаетесь передать). Чтобы решить эту проблему, API JUnit 5 позволяет вам определить пользовательский ParameterResolver и впоследствии применить его с помощью @ExtendsWith

Я ввел объект-заглушка для упрощения, но уверен, что есть возможность решить это с 2 String параметрами

Спасибо за решение. Извиняюсь за задержку с ответом. Я просто забыл :-(

Shejo284 29.06.2019 18:15

Все хорошо. Надеюсь помог!)

gokareless 29.06.2019 21:12

очень помогло :-)

Shejo284 29.06.2019 23:35

Другие вопросы по теме