I am following this tutorial and have reached the testing portion. When I create the HelloControllerTest file as well as a HelloControllerIT file in my test directory at src/test/java/hello/ only the HelloControllerTest test runs. However, if I rename the second file to end with the word Test, such as HelloController2Test, then it also runs. I'm running the tests from command line during the Maven build with mvn clean verify. I'm running Maven 3.3.9 on OSX.
I have two main questions: how does Maven know which tests to run? And, more importantly, how do I tell Maven to run other tests? Below is my pom.xml, taken directly from the tutorial:
<?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>org.springframework</groupId>
<artifactId>gs-spring-boot</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<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>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
The maven-surefire-plugin will, by default, attempt to execute all tests that follow the pattern of Test*.java or *Test.java or *TestCase.java. It ignores your HelloControllerIT very intentionally, as by standard maven convention, that is not a unit test, it is an integration test. The maven-surefire-plugin is enabled by default in all maven projects.
There is a separate plugin, maven-failsafe-plugin, used to run integration tests, denoted (by default) by the naming pattern IT*.java or *IT.java or *ITCase.java. It runs during the integration-test phase of the build rather than the test phase. However, unlike maven-surefire-plugin, you need to explicitly enable it. (I don't know why this is.)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Add maven-failsafe-plugin to your project, and your integration test should run just fine.
1) how does Maven know which tests to run? By default, maven executes all tests. I mean, all test that Maven finds.
2) how do I tell Maven to run other tests? To execute a specific test class (eg. HelloController2Test), you can do this :
mvn -Dtest=HelloController2Test test
Reference doc here
One other explanation(from the well known site MKYong)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With