【问题标题】:Micronaut: test is failing with Page not foun, but the page can be accessed normally via browserMicronaut:测试失败,页面未找到,但该页面可以通过浏览器正常访问
【发布时间】:2019-05-04 07:30:43
【问题描述】:

我正在学习如何使用 Micronaut 来创建 REST 服务,但是我看不到测试设置有问题,无论我在代码或 gradle 中进行什么更改,我在运行时总是会收到一个恼人的“找不到页面”错误测试,但不是在应用程序正常运行时。

我在包br.com.myproject 中有一个名为App 的类。在这个类中我只有main方法,如下:

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!");
    }

}

最后,我的 gradle 设置:

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'

我的测试和我的 gradle 设置都是基于 Micronaut 文档 (this one) 中的代码示例编写的。不知何故,代码示例中的测试工作正常。

例如,这些是我在问这里之前尝试过的:

  • 更改了依赖项的版本以匹配代码示例中的版本:它不起作用;
  • 将所有类放在同一个包下 (br.com.myproject):没用;
  • 将示例代码的 gradle 设置复制/粘贴到我的 gradle 设置中并正确更改包名称:它不起作用;
  • 打印出测试中使用的 URL 只是为了检查它是否正确:它是正确的,但仍然会抛出“找不到页面”。

但是,当我运行应用程序并将地址输入浏览器时,一切正常。

我在 Google 上搜索了关键字“未找到 micronaut 测试页面”和类似内容,但没有发现任何有用的文章可以帮助我解决此错误。

顺便提一下:我对 gradle 配置并不完全熟悉,因此我怀疑我可能在这里缺少一些东西。

有人知道我可能缺少什么吗?

感谢任何提示。

谢谢 =)

【问题讨论】:

  • 我对 Micronaut 不是很熟悉,但是当您进行“真正的”启动时,您正在运行 App.class,我在您的测试中没有看到任何引用。跨度>
  • @chrylis 测试不需要提及App.class。他在那里显示的代码很好。

标签: java gradle junit micronaut


【解决方案1】:

在https://github.com/jeffbrown/jonathansouzanotfound 上查看该项目。我已将您的代码直接粘贴到该项目中(并添加了缺少的导入语句)并且测试通过了。

 $ ./gradlew clean test

> Task :compileJava

... 

BUILD SUCCESSFUL in 4s
5 actionable tasks: 5 executed

【讨论】:

  • 您没有说明您是如何运行测试的,但如果您在没有使用 Gradle 的情况下从 IDE 运行测试,请确保您在 IDE 中启用了注释处理器。见docs.micronaut.io/latest/guide/index.html#ideSetup。
  • 我没有尝试直接通过终端运行测试。我现在做到了,它工作正常。我的 IntelliJ 设置似乎有问题。我已经保证启用了“启用注释处理器”,但仍然失败。我将与示例项目中的设置进行比较,效果很好。非常感谢您的帮助。
【解决方案2】:
 @Get("/")
    @Produces (MediaType.TEXT_PLAIN)
    public String index(){
        return "Hello World";
    }

【讨论】:

    【解决方案3】:

    引用自Jeff's 评论并在此回复以使其更加可见

    如果您通过 IDE 运行测试,请确保在 IDE 中启用注释处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2022-07-11
      相关资源
      最近更新 更多