Динамическое переключение между мягкими утверждениями и жесткими утверждениями с помощью AssertJ - PullRequest
1 голос
/ 16 октября 2019

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

Либо используя

Assertions.assertThat(...)

, либо используя

softlyAssertInstance.assertThat(...)

Я не хочу ставитьпроверить во всех местах, которые выглядят следующим образом:

if(softlyAssertInstance != null) {
    softlyAssertInstance.assertThat(...);
} else {
    Assertions.assertThat(...);
}

Скорее я бы предпочел что-то вроде следующего:

getAssertor().assertThat(...);

Таким образом, я могу выполнить свою проверку if-else в getAssertor следующим образом:

public ReturnType getAssertor() {//Don't know what my return type should be here
    if(softlyAssertInstance != null)
        return softlyAssertInstance;
    else
        return Assertions;
}

Я думал об этом, но возвращаемый тип Object не совсем помогает, так как я сужаю методы, которые можно вызывать для возвращаемого объекта. Например,

Object assertor = getAssertor();
assertor.assertThat();//this isn't possible unless I cast it down

Я бы хотел, чтобы это происходило динамически. Единственный способ видеть вперед - через Java Reflections, где я, вероятно, могу вернуть экземпляр Method. Это может выглядеть следующим образом:

public Method getAssertingMethod() {
    if(softlyAssertInstance != null) {
        return softlyAssertInstance.class.getDeclaredMethod("assertThat", {String.class});
    else
        return Assertions.class.getDeclaredMethod("assertThat", {String.class});
}

Мне все еще нужно было бы динамически определить, использовать ли здесь String.class или Boolean.class на основе вызывающего кода. Кажется, это интенсивный маршрут, который я считаю слишком сложным. Любые предложения, которые помогут мне лучше выполнить мои требования?

...