Java mvn clean verify未能通过集成测试:没有类型为的合格bean

Java mvn clean verify未能通过集成测试:没有类型为的合格bean,java,maven,spring-boot,integration-testing,Java,Maven,Spring Boot,Integration Testing,当我运行mvn clean verify时,集成测试失败,但当我运行intelliJ的测试时,它们都通过了。我正在使用JUnit5 这是堆栈跟踪: 04-09-2019 15:03:44.923 [it.soluxioni.ars.ArsApplication.main()] DEBUG it.soluxioni.ars.ArsApplication.logStarting - Running with Spring Boot v2.1.7.RELEASE, Spring v5.1.9.RELE

当我运行
mvn clean verify
时,集成测试失败,但当我运行intelliJ的测试时,它们都通过了。我正在使用JUnit5

这是堆栈跟踪:

04-09-2019 15:03:44.923 [it.soluxioni.ars.ArsApplication.main()] DEBUG it.soluxioni.ars.ArsApplication.logStarting - Running with Spring Boot v2.1.7.RELEASE, Spring v5.1.9.RELEASE
04-09-2019 15:03:44.923 [it.soluxioni.ars.ArsApplication.main()] INFO  it.soluxioni.ars.ArsApplication.logStartupProfileInfo - The following profiles are active: test
[WARNING] 
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:543)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'comunicationController' defined in file [/home/gavino/Work/ars/target/classes/it/soluxioni/ars/controllers/ComunicationController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mailServiceImpl' defined in file [/home/gavino/Work/ars/target/classes/it/soluxioni/ars/services/MailServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
    at it.soluxioni.ars.ArsApplication.main(ArsApplication.java:135)
    ... 6 more
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mailServiceImpl' defined in file [/home/gavino/Work/ars/target/classes/it/soluxioni/ars/services/MailServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
    ... 25 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1658)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1217)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
这是用于测试OAuth2身份验证的测试类

@SpringBootTest(classes = ArsApplication.class)
@WebAppConfiguration
@ActiveProfiles("test")
@ContextConfiguration(classes = {IntegrationTestConfiguration.class})
public class OAuthResourceServerTestIT {

    private static final String CLIENT_ID = "asd";
    private static final String CLIENT_SECRET = "asd";
    private static final String CONTENT_TYPE = "application/json;charset=UTF-8";

    private static final String NORMAL_USERNAME = "NormalUser";
    private static final String ADMIN_USERNAME = "Administrator";
    private static final String PASSWORD = "asd";

    private MockMvc mvc;
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RoleRepository roleRepository;
    @Autowired
    private OAuth2ClientRepository clientRepository;
    @Autowired
    PasswordEncoder passwordEncoder;

    @Autowired
    private WebApplicationContext webapp;

    @BeforeEach
    public void before() {
        mvc = MockMvcBuilders.webAppContextSetup(webapp)
                .apply(SecurityMockMvcConfigurers.springSecurity())
                .alwaysDo(MockMvcResultHandlers.print())
                .build();
       ....
       //in memory db setup

    }

    @AfterEach
    public void tearDown() {
        ...
        //clean up db
    }

    @Test
    public void passwordGrant() throws Exception {
        final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "password");
        params.add("username", ADMIN_USERNAME);
        params.add("password", PASSWORD);
        params.add("scope", "read");


        ResultActions result = mvc.perform(MockMvcRequestBuilders.post("/oauth/token")
                .params(params)
                .with(SecurityMockMvcRequestPostProcessors.httpBasic(CLIENT_ID, CLIENT_SECRET))
                .accept(CONTENT_TYPE))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().contentType(CONTENT_TYPE));
    }

    @Test
    public void testPublicResourceWithAnonymousUser() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/public/hello")).andExpect(MockMvcResultMatchers.status().isOk());
    }

   ......
   //other tests


    private String obtainAccessToken(String username, String password) throws Exception {
        final MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "password");
        params.add("username", username);
        params.add("password", password);
        params.add("scope", "read");
        ResultActions result = mvc.perform(MockMvcRequestBuilders.post("/oauth/token")
                .params(params)
                .with(SecurityMockMvcRequestPostProcessors.httpBasic(CLIENT_ID, CLIENT_SECRET))
                .accept(CONTENT_TYPE));


        String resultString = result.andReturn().getResponse().getContentAsString();

        JacksonJsonParser jsonParser = new JacksonJsonParser();
        return jsonParser.parseMap(resultString).get("access_token").toString();
    }
}
问题似乎是spring无法自动连接来自我的服务请求的javaMailSenderImpl(我也尝试过接口,但都是一样的)。 服务实现:

@Service
@Primary
public class MailServiceImpl implements MailService {

    private JavaMailSenderImpl javaMailSender;

    public MailServiceImpl(JavaMailSenderImpl javaMailSender) {
        this.javaMailSender = javaMailSender;
    }
   ...
   //methods
}
我的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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>test.it</groupId>
    <artifactId>myApp</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>ars</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
        <junit-platform-version>5.5.1</junit-platform-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <!-- <exclusions>
                 <exclusion>
                     &lt;!&ndash; declare the exclusion here &ndash;&gt;
                     <groupId>javax.activation</groupId>
                     <artifactId>activation</artifactId>
                 </exclusion>
             </exclusions>-->
        </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</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>

        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>

        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.3.5.RELEASE</version>

        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-jwt</artifactId>
            <version>1.0.10.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.github.darrachequesne</groupId>
            <artifactId>spring-data-jpa-datatables</artifactId>
            <version>5.0.0</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.194</version>
        </dependency>


        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>ars</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <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>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <activatedProperties>dev</activatedProperties>
            </properties>

        </profile>
        <profile>
            <id>production</id>
            <properties>
                <activatedProperties>production</activatedProperties>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <activatedProperties>test</activatedProperties>
            </properties>
        </profile>
    </profiles>
</project>


4.0.0
org.springframework.boot
spring启动程序父级
2.1.7.发布
测试它
myApp
战争
0.0.1-快照
人工鱼
SpringBoot的演示项目
11
5.5.1
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
春季启动邮件
org.springframework.boot
弹簧启动安全
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧靴开发工具
运行时
org.projectlombok
龙目
真的
org.springframework.boot
弹簧起动试验
测试
朱尼特
朱尼特
org.junit.jupiter
JUnitJupiter api
org.junit.jupiter
朱尼特木星发动机
org.mockito
莫基托朱庇特酒店
org.springframework.security
弹簧安全性试验
测试
org.springframework.security.oauth
spring-security-oauth2
2.3.5.1发布
javax.xml.bind
jaxb api
2.3.0
com.sun.xml.bind
jaxb内核
2.3.0
com.sun.xml.bind
jaxb impl
2.3.0
javax.activation
激活
1.1.1
org.springframework.security
spring security jwt
1.0.10.1发布
com.github.darrachequesne
spring数据jpa数据表
5.0.0
文件上传
文件上传
1.4
org.springframework.boot
springbootstarter缓存
org.springframework.boot
弹簧启动机tomcat
假如
com.h2数据库
氢
1.4.194
org.postgresql
postgresql
运行时
人工鱼
org.springframework.boot
springbootmaven插件
预集成测试
开始
整合后测试
停止
发展
发展
生产
生产
测试
测试
我使用“测试”配置文件运行测试

如果我跑
mvn清洁测试编译故障保护:集成测试

所有集成测试运行并通过

我认为问题在于maven启动您的spring boot web应用程序(在执行测试之前没有测试依赖项),因为:

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

预集成测试
开始
我希望您在使用概要文件测试启动spring引导应用程序时会遇到完全相同的错误


IntegrationTestConfiguration
放在主代码中并用
@Profile(“test”)


编辑:或者您根本不需要启动应用程序,请选择最适合您的应用程序。

我认为问题在于maven启动您的spring boot web应用程序(在执行测试之前没有测试依赖项),因为:

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

预集成测试
开始
我希望您在使用概要文件测试启动spring引导应用程序时会遇到完全相同的错误


IntegrationTestConfiguration
放在主代码中并用
@Profile(“test”)


编辑:或者您根本不需要启动应用程序,请选择最适合您的情况。

集成测试配置位于哪个文件夹中?
IntegrationTestConfiguration
位于哪个文件夹中?
IntegrationTestConfiguration
位于哪个文件夹中
src/test/configuration
如果我删除了执行标记,我会得到这样的结果:`Failed to execute goal org.springframework.boot:spring boot maven plugin:2.1.7.RELEASE:stop(post integration test)on project ars:spring应用程序生命周期JMX bean找不到(fork为null)。无法优雅地停止应用程序`如果您不启动,那么您应该(当然)也不要停止它。但我从来没有建议把它拿走。相反,请测试