Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring忽略子模块集成测试中的bean_Java_Spring_Spring Boot_Spring Mvc_Integration Testing - Fatal编程技术网

Java Spring忽略子模块集成测试中的bean

Java Spring忽略子模块集成测试中的bean,java,spring,spring-boot,spring-mvc,integration-testing,Java,Spring,Spring Boot,Spring Mvc,Integration Testing,我在一个多模块项目中使用Spring Boot。考虑到我想测试每个独立的模块,我已经创建了很多单元测试,现在我正在为我的服务项目编写集成测试 也就是说,我创建了一个抽象配置,如下所示: 包br.com.rk.services; 导入org.junit.jupiter.api.extension.extensedWith; 导入org.springframework.boot.autoconfigure.springboot应用程序; 导入org.springframework.boot.test

我在一个多模块项目中使用Spring Boot。考虑到我想测试每个独立的模块,我已经创建了很多单元测试,现在我正在为我的服务项目编写集成测试

也就是说,我创建了一个抽象配置,如下所示:

包br.com.rk.services;
导入org.junit.jupiter.api.extension.extensedWith;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.boot.test.context.SpringBootTest;
导入org.springframework.test.context.jdbc.Sql;
导入org.springframework.test.context.junit.jupiter.SpringExtension;
/**
*@作者Rhuan Karlus
*@自19年6月3日起
*/
@ExtendWith(SpringExtension.class)
@Sql({“/drop_data.Sql”,“/data.Sql”})
@春靴测试(
webEnvironment=SpringBootTest.webEnvironment.MOCK,
属性={
“spring.datasource.name=HikariCP池”,
“spring.datasource.type=com.zaxxer.hikari.HikariDataSource”,
“spring.datasource.driver类名=org.hsqldb.jdbcDriver”,
“spring.datasource.url=jdbc:hsqldb:mem:。”,
“spring.datasource.username=sa”,
“spring.datasource.password=”,
“spring.flyway.enabled=true”,
“spring.flyway.locations=classpath:/db/migrations/hsql”,
“spring.data.jpa.repositories.enabled=true”,
“spring.jpa.show sql=true”,
“debug=true”
})
公共抽象类AbstractServiceIntegrationTest{
@SpringBootApplication(scanBasePackages=“br.com.rk”)
静态类测试应用程序{
}
}
请注意,我的所有属性都被描述在
@SpringBootTest
注释的
properties
参数中。这是为了避免创建另一个
application test.properties
,因为它已经在
api
模块中创建(项目中的另一个模块,它位于服务层之上,因此对于服务层它甚至不存在)

下面是一个简单的测试:

包br.com.rk.services;
导入org.junit.jupiter.api.Test;
/**
*@作者Rhuan Karlus
*@自19年6月3日起
*/
公共类TestAndoIntegration扩展了AbstractServiceIntegrationTest{
@试验
public-void-simpleTest(){
System.out.println(“foo”);
}
}
当我尝试运行
simpleTest
方法时,就会出现问题。它正确加载上下文配置(bean除外),然后抛出以下消息:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'br.com.rk.repositories.audit.AuditRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1509)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724)
    ... 84 more
正如您所看到的,日志会告诉
AuditRepository
,没有符合条件的bean可以自动连接到我的一个服务上,但问题是bean是用
@Repository
定义和注释的,这适用于
api
模块(已经提到)。所以我不明白这里发生了什么,也不知道如何配置这些测试来正确加载Spring上下文以访问所有bean

下面是我的
AuditRepository

package br.com.rk.repositories.audit;
导入br.com.rk.entities.audit.audit;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.stereotype.Repository;
/**
*@作者Rhuan Karlus
*@自19年3月22日起
*/
@存储库
公共接口AuditRepository扩展了JpaRepository

我正在尝试测试
项目服务
模块。

而不是

@SpringBootApplication(scanBasePackages = "br.com.rk.*")
试一试


我对从头开始设置SpringBoot应用程序没有太多经验。但是,我从未在测试类中使用
package private
作为SpringBoot应用程序类。我一直使用
public
。尝试:

@SpringBootApplication(scanBasePackages = "br.com.rk")
public class MyAwesomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication .class, args);
    }
}

这应该在
src/main/java
目录中。

它不起作用。顺便说一句,我删除了这个配置(它只是“br.com.rk”,我复制/粘贴了我改为测试的代码),谢谢你的回复,但它也不起作用,我试图在测试上下文中分离这个文件,并在应用程序本身上下文中分离,两者都失败了。那么可能是类路径问题。我经常收到这些。您是使用IDE来运行测试,还是使用Maven或Gradle?我建议尝试一个外部运行者来排除IDE问题。我发现Intellij的“将目录标记为…”功能非常脆弱。您的源根目录和测试根目录是否标记为这样?只要“构建路径”是正确的,Eclipse就更好一些。如果我对你说的太多了,我会在一个单独的答案中对此进行分解。伙计,我想接受你的答案,因为我解决了问题,而你是最接近答案的。所以,如果你编辑它,我会接受!解决办法来了。我将在一些评论中分开答案。1:我创建了一个像你所说的类,但它不起作用,因为我在包br.com.rk.services扫描“br.com.rk”中创建了它,这就是为什么它不能扫描我的bean,因为我不知道为什么Spring不能在@SpringBootApplication类之前扫描包中的bean。因此,我只是将该类传递给包“br.com.rk”,它正确地加载了我的所有bean。第二:我将该类移动到了测试模块(src/main/tests),因为它不需要在src/main/java中执行和加载上下文(但我保留了前面提到的包)
@SpringBootApplication(scanBasePackages = "br.com.rk")
public class MyAwesomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication .class, args);
    }
}