Micronaut: тест не работает, страница не открыта, но к странице можно получить доступ в обычном режиме через браузер

Я учился использовать Micronaut для создания служб REST, но что-то, чего я не вижу, не так с настройками моих тестов, и что бы я ни менял в своем коде или в градиенте, я всегда получаю раздражающую ошибку `` Страница не найдена '' при запуске тестов, но не когда приложение работает нормально.

У меня есть класс с именем App в пакете br.com.myproject. В этом классе у меня есть только основной метод, а именно:

public static void main(final String[] args) {
    Micronaut.run(App.class);
}

В подпакете br.com.myproject.controllers у меня есть класс HelloController, помеченный @Get("/hello"), который должен ответить одним "Hello, World!" текст, и это происходит обычно, когда я открываю его через браузер:

package br.com.myproject.controllers;

@Controller("/hello")
public class HelloController {

    @Get("/")
    @Produces(MediaType.TEXT_PLAIN)
    public String index() {
        return "Hello, World!";
    }

}

В каталоге тестов у меня есть класс HelloControllerTest, который должен гарантировать, что моя конечная точка /hello работает правильно. Но, к сожалению, мой тест не проходит с исключением PageNotFound.

Мой классный тест выглядит следующим образом:

package br.com.myproject.controllers;

public class HelloControllerTest {

    private static EmbeddedServer server;
    private static HttpClient client;

    @BeforeClass
    public static void setupServer() {
        server = ApplicationContext.run(EmbeddedServer.class);
        client = server
                .getApplicationContext()
                .createBean(HttpClient.class, server.getURL());
    }

    @AfterClass
    public static void stopServer() {
        if (client != null)
            client.stop();

        if (server != null)
            server.stop();
    }

    @Test
    public void testHello() throws Exception {
        HttpRequest<String> httpRequest = HttpRequest.GET("/hello");
        String body = client.toBlocking().retrieve(httpRequest);
        Assert.assertNotNull(body);
        Assert.assertEquals(body, "Hello, World!");
    }

}

И, наконец, мои настройки градиента:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.3'
        classpath 'io.spring.gradle:dependency-management-plugin:1.0.6.RELEASE'
        classpath 'net.ltgt.gradle:gradle-apt-plugin:0.15'
    }
}

plugins {
    id 'io.spring.dependency-management' version '1.0.6.RELEASE'
    id 'com.github.johnrengelman.shadow' version '4.0.3'
    id 'application'
    id 'java'
    id 'net.ltgt.apt-idea' version '0.15'
}

group 'br.com.myproject'
version '1.0.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenLocal()
    mavenCentral()
    maven { url "https://plugins.gradle.org/m2/" }
}

dependencies {
    annotationProcessor 'io.micronaut:micronaut-inject-java:1.0.0'

    compile 'io.micronaut:micronaut-http-client:1.0.0'
    compile 'io.micronaut:micronaut-http-server-netty:1.0.0'
    compile 'io.micronaut:micronaut-inject:1.0.0'
    compile 'io.micronaut:micronaut-runtime:1.0.0'
    compileOnly 'io.micronaut:micronaut-inject-java:1.0.0'

    runtime 'ch.qos.logback:logback-classic:1.2.3'

    testCompile 'junit:junit:4.12'
    testCompile 'io.micronaut:micronaut-inject-java:1.0.0'
}

shadowJar {
    mergeServiceFiles()
}

mainClassName = 'br.com.myproject.App'

И мои тесты, и мои настройки градиента были написаны на основе примера кода в документации Micronaut (этот). И почему-то тесты в примере кода работают нормально.

Например, вот что я пробовал, прежде чем спрашивать здесь:

  • Изменены версии зависимостей, чтобы они соответствовали версиям в примере кода: не работало;
  • Поместите все классы в один пакет (br.com.myproject): не сработало;
  • Скопируйте / вставьте настройки градиента из примера кода в мои настройки градиента и правильно измените имена пакетов: это не сработало;
  • Распечатайте URL-адрес, использованный в тесте, просто чтобы проверить, верен ли он: он правильный, но все равно выдается сообщение «Страница не найдена».

Однако все работает нормально, когда я запускаю приложение и набираю адрес в браузере.

Я искал в Google ключевые слова «тестовая страница микронавта не найдена» и аналогичные, но не нашел полезных статей, которые помогли бы мне исправить эту ошибку.

Просто упомяну: я не полностью знаком с конфигурацией gradle и поэтому подозреваю, что мне здесь чего-то не хватает.

Кто-нибудь знает, что мне может не хватать?

Я ценю любые чаевые.

Спасибо =)


person Jonathan Souza    schedule 03.12.2018    source источник
comment
Я не очень знаком с Micronaut, но когда вы выполняете настоящий запуск, вы запускаете App.class, и я не вижу ссылки на это в вашем тесте.   -  person chrylis -cautiouslyoptimistic-    schedule 03.12.2018
comment
@chrylis В тесте не нужно упоминать App.class. Код, который он там показывает, в порядке.   -  person Jeff Scott Brown    schedule 03.12.2018


Ответы (2)


См. Проект по адресу https://github.com/jeffbrown/jonathansouzanotfound. Я вставил ваш код прямо в этот проект (и добавил недостающие операторы импорта), и тест прошел.

 $ ./gradlew clean test

> Task :compileJava

... 

BUILD SUCCESSFUL in 4s
5 actionable tasks: 5 executed
person Jeff Scott Brown    schedule 03.12.2018

Ссылается на комментарий Джеффа и ответил на него здесь, чтобы сделать его более заметным

Убедитесь, что обработка аннотаций включена в IDE, если вы запускаете тесты через IDE.

введите описание изображения здесь

person kooskoos    schedule 29.06.2021