Spring boot 在Spring引导中运行测试在上下文中失败

Spring boot 在Spring引导中运行测试在上下文中失败,spring-boot,spring-boot-test,Spring Boot,Spring Boot Test,我正在编写一个SpringBoot(1.5.7)REST应用程序,它运行良好,没有问题 现在我正试图编写一些单元/集成测试,但我不知道如何配置它们 这是我的Application.java @EntityScan @SpringBoot应用程序 公共类应用程序 { 公共静态void main(字符串[]args) { SpringApplication.run(Application.class,args); } @豆子 公共模块hibernate5Module() { 返回新模块(); } }

我正在编写一个SpringBoot(1.5.7)REST应用程序,它运行良好,没有问题

现在我正试图编写一些单元/集成测试,但我不知道如何配置它们

这是我的Application.java

@EntityScan
@SpringBoot应用程序
公共类应用程序
{
公共静态void main(字符串[]args)
{
SpringApplication.run(Application.class,args);
}
@豆子
公共模块hibernate5Module()
{
返回新模块();
}
}
这是我的测试之一,NetworkServiceTest.java

@RunWith(SpringRunner.class)
@SpringBootTest(类=Application.class)
@ActiveProfiles(profiles=“test”)
@DataJpaTest
公共类NetworkServiceTest
{
@自动连线
私人测试经理;
@自动连线
专用网络服务;
@试验
查找设施和运动ID时公共无效\u然后返回网络()
{
//给定
网络=新网络(100200);
manager.persist(net);
manager.flush();
//什么时候
找到的网络=service.findbyFacilityAndSportId(net.getFacilityId(),net.getSportId());
//然后
断言(find.getFacilityId()).isEqualTo(net.getFacilityId());
assertThat(found.getSportId()).isEqualTo(net.getSportId());
}
}
所有测试都返回“NoSuchBeanDefinitionException:没有可用的'com.example.NetworkService'类型的符合条件的bean:至少需要1个符合autowire候选项条件的bean。依赖项批注:{@org.springframework.beans.factory.annotation.Autowired(required=true)}”

这是配置文件application-test.yml

spring:
数据源:
url:jdbc:h2:mem:testdb;DB\u关闭\u打开\u退出=错误
用户名:sa
密码:
驱动程序类名:org.h2.driver
jpa:
冬眠:
ddl自动:创建
液化:
已启用:false
我会调查。我发现它对于单元测试spring引导应用程序非常有用

你最终会得到类似的东西

public class NetworkServiceTest
{
    @Mock
    private TestEntityManager manager;
    @Mock
    private NetworkService service;

    ....
}

您已经用
@DataJpaTest
注释了测试类,但是您似乎正在测试服务层(因为您正在尝试自动连接NetworkService),而不是JPA层


尝试删除
@DataJpaTest
注释。

解决了@darren forsythe的以下提示

BaseTest.java

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles=“test”)
抽象类基类测试
{
@试验
public void init(){}
}
BaseDatabaseTest.java

@DataJpaTest
@ComponentScan(basePackages={“com.example.services”})
抽象类BaseDatabaseTest扩展了BaseTest
{
@自动连线
受保护的测试管理员m_pManager;
@试验
public void initDatabase(){}
}
NetworkServiceTest.java

公共类NetworkServiceTest扩展了BaseDatabaseTest
{
@自动连线
专用网络服务;
@试验
查找设施和运动ID时公共无效\u然后返回网络()
{
长设施ID=100;
长sportId=200;
//给定
网络=新网络(设施ID、运动ID);
m_pManager.persist(net);
m_pManager.flush();
资产(net.getFacilityId()).isEqualTo(facilityId);
//什么时候
List nets=service.findAll();
找到的网络=service.findByFacilityAndSportId(设备ID,sportId);
//然后
资产(nets.size())。大于(0);
断言(find.getFacilityId()).isEqualTo(net.getFacilityId());
assertThat(found.getSportId()).isEqualTo(net.getSportId());
assertThat(found.getSportId()).isNotEqualTo(0);
}
}

谢谢你的提示。现在加载了上下文,但它在第一个assertThat上抛出了一个NPE,因此我假设@DataJpaTest没有正确处理H2。(我在制作中使用Postgres,在测试中使用H2)。我将编辑我的问题,添加H2的配置。您到底想测试什么?
DataJpaTest
不会扫描您的应用程序包中的其他组件或服务,我假设
NetworkService
是这样的。要么向测试类添加ComponentScan以扫描
网络服务
,要么创建一个测试
配置
,从中创建一个bean。我正在尝试测试服务是否可以通过其连接的存储库持久化数据,这就是我添加@DataJpaTest的原因。文档说这个注释将自动配置并运行嵌入式H2,但它不起作用,所以我添加了测试配置文件,试图连接到db。此外,我尝试了ComponentScan、ContextConfiguration等,但都没有成功。用ConfigurationThe
DataJpaTest
注释的静态类都不会用嵌入版本替换您指定的任何数据源,请参阅日志。您的测试失败,因为您正在尝试自动连接尚未为其定义bean的内容。您需要从
NetworkService
创建一个bean,或者扫描它。
DataJpaTest
不会创建/扫描使用存储库的bean/组件/服务。因此,我需要测试配置文件还是@DataJpaTest将完成其余工作?您需要
component扫描
NetworkService
的正确包,
导入
定义
网络服务
bean的正确
配置
,或者创建一个测试
配置
并定义
网络服务
bean。存储库的接口声明为包私有,这就是我使用服务测试数据层的原因