Как вы используете LauncherDiscoveryRequestBuilder для выполнения метода теста, который имеет параметр типа TestInfo? - PullRequest
0 голосов
/ 25 октября 2019

Я опробовал все различные селекторы методов, как показано на этой странице: https://junit.org/junit5/docs/current/api/org/junit/platform/launcher/core/LauncherDiscoveryRequestBuilder.html

Например, попытался сделать это так: selectMethod("org.example.order.OrderTests#test3"),

примерно так: selectMethod("org.example.order.OrderTests#test3(TestInfo)"),

или примерно так: selectMethod("org.example.order.OrderTests#test3(org.junit.jupiter.engine.extension.TestInfoParameterResolver$DefaultTestInfo)")

Каждый раз тесты не обнаруживаются.

Когда я выбираю только класс, в котором находится метод, он работает: selectClass("org.example.order.OrderTests") (но я хочу вызвать метод явно)

Я предполагаю, что поведение такое же длядругие типы параметров, которые разрешаются во время выполнения ParameterResolver.

1 Ответ

1 голос
/ 25 октября 2019

Ваше предположение неверно. Вы можете выбрать один и только один метод испытаний. Как вы упомянули на этой странице Discovery Selectors , существует множество примеров.

DiscoverySelectors.selectMethod предоставляет три способа выбора желаемого метода (ов)

public static MethodSelector selectMethod(String className, String methodName, String methodParameterTypes) {
   ...
}

public static MethodSelector selectMethod(String className, String methodName) {
   ...
}

and

public static MethodSelector selectMethod(String fullyQualifiedMethodName) throws PreconditionViolationException {
   ...
}

ВыЯ пытался использовать последний метод, но fullyQualifiedMethodName немного ошибался. Если вы посмотрите на javadoc , оно появится. Список типов параметров должен точно совпадать, и все не примитивные типы также должны быть полностью квалифицированы.

В вашем примере пакет отсутствует. Попробуйте это так: selectMethod("org.example.order.OrderTests#test3(org.junit.jupiter.api.TestInfo)")

Вот короткий тест.

package io.github.zforgo.stackoverflow;

import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

public class ClassWithTestInfo {

    @Test
    void foo() {
    }

    @Test
    void foo(TestInfo info) {
    }

    @RepeatedTest(3)
    void foo(RepetitionInfo info) {
    }
}

package io.github.zforgo.stackoverflow;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.FilterResult;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.PostDiscoveryFilter;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

class DiscoveryTest {

    @Test
    @DisplayName("Should select only the desired method(s)")
    void doTEst() {
        Assertions.assertAll(
                () -> {
                    var methods = discover(DiscoverySelectors.selectClass(ClassWithTestInfo.class));
                    Assertions.assertEquals(3, methods.size());
                },
                () -> {
                    // your way
                    var fqmn = "io.github.zforgo.stackoverflow.ClassWithTestInfo#foo(TestInfo)";
                    var methods = discover(DiscoverySelectors.selectMethod(fqmn));
                    Assertions.assertEquals(0, methods.size());
                },
                () -> {
                    // good way
                    var fqmn = "io.github.zforgo.stackoverflow.ClassWithTestInfo#foo(org.junit.jupiter.api.TestInfo)";
                    var methods = discover(DiscoverySelectors.selectMethod(fqmn));
                    Assertions.assertEquals(1, methods.size());
                }
        );
    }

    private List<Method> discover(DiscoverySelector... selectors) {
        final List<Method> methodCollector = new ArrayList<>();
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
                .selectors(selectors)
                .filters((PostDiscoveryFilter) object -> {
                    Method m = ((MethodBasedTestDescriptor) object).getTestMethod();
                    methodCollector.add(m);
                    return FilterResult.included("Matched");
                })
                .build();
        LauncherFactory.create().discover(request);

        return methodCollector;
    }
}
...