微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从命令行中的可执行 jar 运行测试 SpringBootTest

如何解决从命令行中的可执行 jar 运行测试 SpringBootTest

我需要运行一个包含所有测试的 jar。 我可以在 jar 中构建所有测试类,但我不知道如何启动主类以在 springboot 中运行 junit 测试。 是否有可能我运行命令行来运行 jar 并启动所有测试并忽略主类。

测试类

@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>


我需要执行什么才能在命令行上从构建的 jar 运行所有测试?


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

解决方法

我有一个使用 junit4SpringRunner 在 jar 中运行 springboot 测试的解决方案。

创建测试类

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

}

创建文件 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>

就是这样:)

让我们创建带有测试的 jar 并运行所有测试

# 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。