javaspring-bootjunitspring-test-mvc

Run Tests SpringBootTest from executable jar in command line


I need to run a jar with all tests in it. I could build all test classes inside jar but I don't know how to boot a main class to run junit tests in springboot. Is it possible I run a command line to run jar and start all test and ignore mainclass.

Test Class

@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@SpringBootTest
@TestPropertySource(locations = "classpath:${test.config.env:application-local.properties}")
@TestMethodOrder(OrderAnnotation.class)
public class RunIntegrationTest {
  // All tests
}

Pom.xml


<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath />
    </parent>

    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <name>...</name>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>


    <build>

        <!-- get all compiled class tests into source class -->
        <testOutputDirectory>target/classes</testOutputDirectory>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


What do I need to exec for running all tests from built jar on command line?


    java -jar build-with-class-test-and-junit-in-it.jar # are there more parameters?


Solution

  • I've got a solution to run springboot test in jar using junit4 and SpringRunner.

    Creating Test Class

    import org.junit.FixMethodOrder;
    import org.junit.Test; // don't use org.junit.jupiter.api.test for this case  
    import org.junit.runner.RunWith;
    import org.junit.runners.MethodSorters;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.TestPropertySource;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    @RunWith(SpringRunner.class) // using SpringRunner instead of @ExtendWith(SpringExtension.class)
    @AutoConfigureMockMvc
    @SpringBootTest
    @TestPropertySource(locations = "classpath:application-${spring.profiles.active:local}.properties")
    @FixMethodOrder(MethodSorters.NAME_ASCENDING)
    public class RunIntegrationTest {
    
     
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        // ... all integration test
        
        @Test
        // ... all integration test
    
    }
    
    

    creating file pom-test-jar.xml

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.2.RELEASE</version>
            <relativePath />
        </parent>
    
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>...</version>
        <name>...</name>
    
        <properties>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </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-data-jpa</artifactId>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <!-- all test class will be compiled with all source   -->
                <!-- <scope>test</scope> -->
            </dependency>
        </dependencies>
    
        <build>
    
            <!-- all test class will be compiled with all source   -->
            <testOutputDirectory>target/classes</testOutputDirectory>
    
    
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!-- changing launcher to exec junit instead of spring main class   -->
                        <mainClass>org.junit.runner.JUnitCore</mainClass>
                        <includeSystemScope>true</includeSystemScope>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    That's all :)

    Let's creating jar with test in it and run all test

    # BUILD TEST JAR: 
    mvn -f "pom-test-jar.xml" clean package -DskipTests
    
    # RUN TEST INTEGRATION
    export SPRING_PROFILES_ACTIVE=hom 
    java  -jar target/myjar.jar br.com.package.test.RunIntegrationTest
    unset SPRING_PROFILES_ACTIVE