我正在一个多模块项目中使用 Spring Boot。鉴于我想测试隔离的每个模块,我已经创建了很多单元测试,现在我正在为我的服务项目编写集成测试。
也就是说,我创建了一个抽象配置,如下所示:
package br.com.rk.services;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.junit.jupiter.SpringExtension;
/**
* @author Rhuan Karlus
* @since 6/3/19
*/
@ExtendWith(SpringExtension.class)
@Sql({"/drop_data.sql", "/data.sql"})
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.MOCK,
properties = {
"spring.datasource.name=HikariCP-Pool",
"spring.datasource.type=com.zaxxer.hikari.HikariDataSource",
"spring.datasource.driver-class-name=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"
})
public abstract class AbstractServiceIntegrationTest {
@SpringBootApplication(scanBasePackages = "br.com.rk")
static class TestApplication {
}
}
请注意,我的所有属性都描述在@SpringBootTest
注释的properties
参数中。这样做是为了避免创建另一个application-test.properties
,因为它已经在api
模块(项目内的另一个模块,它在服务层之上,所以对于服务层来说,它甚至不存在)。
这是一个简单的测试:
package br.com.rk.services;
import org.junit.jupiter.api.Test;
/**
* @author Rhuan Karlus
* @since 6/3/19
*/
public class TestandoIntegracao extends AbstractServiceIntegrationTest {
@Test
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;
import br.com.rk.entities.audit.Audit;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @author Rhuan Karlus
* @since 3/22/19
*/
@Repository
public interface AuditRepository extends JpaRepository<Audit, Long> {
}
-----------------------------编辑-----------------------------
如果你们想检查完整的项目,请查看 https://github.com/rhuankarlus/spring-boot-rest-api/tree/feature/%2315
我正在尝试测试project-services
模块。
我对从头开始设置 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
目录中。
而不是
@SpringBootApplication(scanBasePackages = "br.com.rk.*")
尝试
@SpringBootApplication(scanBasePackages = "br.com.rk")