@MicronautTest does not start the embedded server

I am writing a Spock test for controllers in an app using Micronaut. When using @MicronautTest(application=Application), it throws exception with message @MicronautTest used on test but no bean definition for the test present..

On examining the code, I see the following 2 reasons why Micronaut throws this exception. From io.micronaut.test.extensions.spock.MicronautSpockExtension :

    if (this.specDefinition == null) {
        if (!this.isTestSuiteBeanPresent((Class)spec.getReflection())) {
          throw new InvalidSpecException("@MicronautTest used on test but no bean definition for the test present. This error indicates a misconfigured build or IDE. Please add the 'micronaut-inject-java' annotation processor to your test processor path (for Java this is the testAnnotationProcessor scope, for Kotlin kaptTest and for Groovy testCompile). See the documentation for reference: https://micronaut-projects.github.io/micronaut-test/latest/guide/");
        }
    ...
    }

My POM configuration is:

     <plugin>
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.6</version>
        <executions>
          <execution>
            <goals>
              <goal>addTestSources</goal>
              <goal>addSources</goal>
              <goal>compileTests</goal>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>${jdk.version}</source>
          <target>${jdk.version}</target>
          <encoding>UTF-8</encoding>
          <compilerArgs>
            <arg>-parameters</arg>
          </compilerArgs>
          <annotationProcessorPaths>
            <path>
              <groupId>org.mapstruct</groupId>
              <artifactId>mapstruct-processor</artifactId>
              <version>${mapstruct.version}</version>
            </path>
            <path>
              <groupId>io.micronaut</groupId>
              <artifactId>micronaut-inject-java</artifactId>
              <version>${micronaut.version}</version>
            </path>
            <path>
              <groupId>io.micronaut</groupId>
              <artifactId>micronaut-validation</artifactId>
              <version>${micronaut.version}</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
        <executions>
          <execution>
            <id>test-compile</id>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <compilerArgs>
                <arg>-parameters</arg>
              </compilerArgs>
              <annotationProcessorPaths>
                <path>
                  <groupId>org.mapstruct</groupId>
                  <artifactId>mapstruct-processor</artifactId>
                  <version>${mapstruct.version}</version>
                </path>
                <path>
                  <groupId>io.micronaut</groupId>
                  <artifactId>micronaut-inject-java</artifactId>
                  <version>${micronaut.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </execution>
        </executions>
      </plugin>

If I do not define the annotation the test @MicronautTest, it seems that the application doesn't even start.

Below is the spec code:

@MicronautTest(application= Application)
@PropertySource(value = [
        @Property(name='spec.name', value = 'EndpointSpec'),
        @Property(name = 'endpoints.health.details-visible', value = 'ANONYMOUS'),
        @Property(name = MongoSettings.EMBEDDED, value = 'true'),
])
class EndpointSpec extends Specification {

    @Inject
    EmbeddedServer embeddedServer
    @Inject
    ApplicationContext applicationContext

    @Unroll
    def "test health endpoint is working"() {
        given: 'a RxHttpClient'
        URL server = embeddedServer.getURL()
        RxHttpClient client = new DefaultHttpClient(server, new DefaultHttpClientConfiguration(), '/management')

        when: '/health is called'
        HttpResponse response = client.toBlocking().exchange('/health')

        then: 'response is 200 OK and contains valid headers'
        response.status == HttpStatus.OK
        response.headers.size() == 5
        response.headers.contains('uber-trace-id')
        response.headers.contains('Date')
        response.headers.contains('content-type') && response.headers.get('content-type') == MediaType.APPLICATION_JSON
        response.headers.contains('content-length')
        response.headers.contains('connection')

        //and: 'response contains valid HealthResult'
        //HealthResult healthResult = response.body()
        // Want to validate the health result here but nothing is present in body

    }
}

How I can either defined the specDefinition value or mark the test in such a way that it is present as a bean definition and what is the reason for such a behavior. Any help would be greatly appreciated.


Micronaut-test makes the tests themselves beans. In order for a Groovy test to be a bean, you need to have micronaut-inject-groovy on the compilation path for test.