使用JUnit 5进行Maven测试时出错

时间:2018-06-14 12:00:13

标签: java maven spring-boot junit4 junit5

我在IDE Intellij IDEA 2017.2.4中使用Spring Boot 2.0,Java 8,JUnit 5和Maven。

这是我的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.datastech</groupId>
    <artifactId>cra</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>
    <modules>
        <module>core</module>
        <module>internal</module>
        <module>external</module>
    </modules>

    <name>cra</name>
    <description>CRA connector for Oschadbank</description>

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


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

        <junit.jupiter.version>5.2.0</junit.jupiter.version>
        <junit.platform.version>1.0.3</junit.platform.version>

        <!-- Environment variable -->
        <!-- TODO добавить пользователя для БКИ коннекторов -->
        <mongo.uri>resourceServer:sjv99gKm@192.168.3.43:27017,192.168.3.70:27017</mongo.uri>

        <elasticsearch.host>192.168.3.43</elasticsearch.host>
        <elasticsearch.port>9200</elasticsearch.port>

        <ldap.url>ldap://192.168.3.90:389</ldap.url>
        <ldap.base>DC=contoso,DC=local</ldap.base>
        <ldap.user>CN=Artur,CN=Users,DC=contoso,DC=local</ldap.user>
        <ldap.password>zaq1@WSX</ldap.password>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-ldap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
         <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.restdocs</groupId>
            <artifactId>spring-restdocs-mockmvc</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- AOP -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- AOP -->

        <!-- Util dependencies -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>
        <!-- Util dependencies -->

        <!-- Elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <!-- Elasticsearch -->

        <dependency>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast-spring</artifactId>
        </dependency>

        <!-- JUnit 5 -->
        <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${junit.jupiter.version}</version>
                <scope>test</scope>
            </dependency>
          <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.2.0</version>
            <scope>test</scope>
        </dependency>

        <!-- JUnit 5 -->


    </dependencies>

    <build>
        <plugins>
            <!--  Checkstyle -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <configLocation>checks.xml</configLocation>
                </configuration>
                <executions>
                    <execution>
                        <id>checkstyle</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <failOnViolation>true</failOnViolation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!--  Checkstyle -->

            <!-- Static code analysis -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.9.0</version>
                <configuration>
                    <targetJdk>9</targetJdk>
                    <failOnViolation>true</failOnViolation>
                    <printFailingErrors>true</printFailingErrors>
                    <linkXRef>false</linkXRef>
                    <analysisCache>true</analysisCache> <!-- enable incremental analysis -->
                    <minimumTokens>100</minimumTokens> <!-- minimum code size which trips the CPD -->
                    <rulesets>
                        <!-- A rule set, that comes bundled with PMD -->
                        <ruleset>/category/java/bestpractices.xml</ruleset>
                    </rulesets>
                </configuration>
                <executions>
                    <execution>
                        <phase>test</phase>
                        <goals>
                            <goal>check</goal>
                            <goal>cpd-check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- Static code analysis -->

            <!-- Runs the unit tests -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit.platform.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit.jupiter.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <failIfNoTests>true</failIfNoTests>
                </configuration>
            </plugin>
            <!-- Runs the unit tests -->

        </plugins>
    </build>

</project>

这是我的班级:

@Service
@Profile("!local")
public class CraConfigurationServiceProduction implements CraConfigurationService {

    private static final String SERVICE_NAME = "CraConfigurationService";

    /**
     * Шаблон адреса сервиса поиска конфигурации коннектора БКИ
     */
    private final String internalModuleUrl;

    /**
     * REST Template для взаимодействия с внутренним модулем
     */
    private final RestTemplate restTemplate;

    /**
     * Репозиторий с настройками подключения к БКИ в распределенном кеше
     */
    private final CraConfigImdgRepository craConfigImdgRepository;

    /**
     * Сервис логирования
     */
    private final ElasticsearchService logService;

    public CraConfigurationServiceProduction(RestTemplate restTemplate,
                                             @Value("${system.url.internal}") final String internalUrl,
                                             CraConfigImdgRepository craConfigImdgRepository,
                                             ElasticsearchService logService) {
        this.restTemplate = restTemplate;
        internalModuleUrl = internalUrl + "internal/api/cra/configs/{name}";
        this.craConfigImdgRepository = craConfigImdgRepository;
        this.logService = logService;
    }

    @Override
    public Optional<CraConfigImdg> getConfiguration(String craName) {
        CraConfigImdg result = craConfigImdgRepository.getCraConfigByName(craName);

        if (result == null) {
            GenericResponse<CraConfigDto> response;

            try {
                response = restTemplate.exchange(internalModuleUrl, HttpMethod.GET, null,
                        new ParameterizedTypeReference<GenericResponse<CraConfigDto>>() {
                        }, craName).getBody();
            } catch (Exception e) {
                // TODO Добавить логирование
                return Optional.empty();
            }

            if (response == null || response.getData() == null) {
                return Optional.empty();
            } else {
                CraConfigImdg craConfigImdg = new CraConfigImdg(response.getData());
                updateConfiguration(craConfigImdg);
                return Optional.of(craConfigImdg);
            }
        } else {
            return Optional.of(result);
        }
    }
}

这是我的JUnit测试:

public class CraConfigurationServiceProductionTest extends AbstractSpringTest {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${system.url.internal}")
    private String internalUrl;

    @Autowired
    private CraConfigImdgRepository craConfigImdgRepository;

    @Autowired
    private ElasticsearchService logService;

    private CraConfigurationService craConfigurationService;

    private MockRestServiceServer mockServer;

    private String serviceUrl;

    @BeforeEach
    public void setUp() {
        craConfigurationService = new CraConfigurationServiceProduction(restTemplate,
                internalUrl, craConfigImdgRepository, logService);
        mockServer = MockRestServiceServer.createServer(restTemplate);
        serviceUrl = internalUrl + "internal/api/cra/configs/";
    }

    @Test
    public void getConfigurationSuccessful() throws Exception {
        String craConfigResponse = loadResourceAsString("responses/internal/get-cra-configuration-successful.json");

        mockServer
                .expect(requestTo(serviceUrl + "kyivstar"))
                .andExpect(method(HttpMethod.GET))
                .andRespond(withSuccess(craConfigResponse, MediaType.APPLICATION_JSON));

        Optional<CraConfigImdg> response = craConfigurationService.getConfiguration("kyivstar");
        mockServer.verify();

        assertThat(response.isPresent()).isTrue();

        CraConfigImdg craConfigImdg = response.orElse(null);

        assertThat(craConfigImdg).isNotNull();
        assertThat(craConfigImdg.getName()).isNotNull().isEqualTo("kyivstar");
        assertThat(craConfigImdg.getUrl()).isNotNull().isEqualTo("https://scoring.kyivstar.ua/rest/api/v1/scoring");
        assertThat(craConfigImdg.getUser()).isNotNull().isEqualTo("user");
        assertThat(craConfigImdg.getPassword()).isNotNull().isEqualTo("password");

        mockServer.reset();
    }
}

当我运行这个测试类时,我得到了一个成功的结果。但是当我尝试在maven surefire插件的帮助下进行clean-test-verify时,我收到以下错误:

Failed tests: CraConfigurationServiceProductionTest.getConfigurationSuccessful:67 Further request(s) expected leaving 1 unsatisfied expectation(s).
0 request(s) executed.

问题出在mockServer.verify();字段。

使用JUnit4一切正常,没有错误。我尝试使用JUnit4中的@Test,因为我在pom.xml中有一个junit-vintage-engine依赖,但它没有帮助。

1 个答案:

答案 0 :(得分:0)

根据JUnit official documentation,JUnit 5和IntelliJ IDEA之间存在一些不兼容性。他们建议使用IntelliJ IDEA 2017.3或更新版本。

我甚至在版本2018.1上遇到了一些问题,并且使用推荐的其他Maven依赖项解决了这个问题。我还必须像其他人一样将junit-jupiter-api依赖版本设置为5.2.0。

Build Support with Maven部分可用于配置maven-surefire-plugin