14

I have a spring-boot based application, and the pom.xml file is configured as below.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <includes>
                        <include>**/IT*.java</include>
                        <include>**/*IT.java</include>
                        <include>**/*ITCase.java</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

The main method located in class DemoApplication as below

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        System.out.println("This is a demo application+++++++++++++++++++");
        SpringApplication.run(DemoApplication.class, args);
    }
}

And my integration test class called DemoIT as following.

package com.example.demo;

import org.junit.Test;

public class DemoIT {

    @Test
    public void test() {
        System.out.println("This is a integration test.==============");
    }
}

Now here is my question, when I issue mvn clean verify command, the integration class DemoIT is supposed to be executed, and it does. However, my DemoApplication isn't running. So I'm wondering if my integration test needs to be executed under the spring-boot application context (the DemoApplication needs running), what should I do to make it happen?

kenshinji
  • 2,021
  • 4
  • 25
  • 39

2 Answers2

10

Here is a document for

Spring Boot Maven Plugin
Last Published: 2021-01-22| Version: 2.5.x

It says

While you may start your Spring Boot application very easily from your test (or test suite) itself, it may be desirable to handle that in the build itself. To make sure that the lifecycle of you Spring Boot application is properly managed around your integration tests, you can use the start and stop goals as described below:

<build>
  ...
  <plugins>
    ...
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.0.2.RELEASE</version>
      <executions>
        <execution>
          <id>pre-integration-test</id>
          <goals>
            <goal>start</goal>
          </goals>
        </execution>
        <execution>
          <id>post-integration-test</id>
          <goals>
            <goal>stop</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
  ...
</build>

For who not familiar with integration test, I found this answer also quite helpful.

Olov
  • 1,103
  • 11
  • 27
Shihe Zhang
  • 2,641
  • 5
  • 36
  • 57
  • 1
    what goals do you invoke in order to kick off your integration tests? Does the config that you are talking about start/stop the server only once per a set of ITs? – Ihor M. Aug 21 '19 at 23:02
9

Since my application is based on Spring-Boot, and spring-boot-maven-plugin is included in pom.xml, so what I need to do is to add following configuration to make sure the lifecycle of our Spring Boot application is well managed around.

<executions>
  <execution>
    <id>pre-integration-test</id>
    <goals>
      <goal>start</goal>
    </goals>
  </execution>
  <execution>
    <id>post-integration-test</id>
    <goals>
      <goal>stop</goal>
    </goals>
  </execution>
</executions>

Then when I issue mvn clean verify, the spring boot application will be running with our integration test code.

kenshinji
  • 2,021
  • 4
  • 25
  • 39