如何在 spring 启动时从数据库中检索对象以进行测试?
How do I retrieve an object from a database in spring boot for testing?
我对单元测试或集成测试不是很有经验。我有以下场景:我只是想从我的数据库中获取一个对象用于测试。该对象不会更新,我懒得手动创建它,因为它很长class而且会很麻烦。
我从数据库中获取内容的结构是调用存储库接口的服务 class。现在我的问题是当我 运行 测试时存储库为空。
正在使用
@DataJpaTest
和
@AutoConfigureTestDatabase(replace = Replace.NONE)
我可以连接到我的数据库,但服务 class 中的存储库为空。
我尝试模拟存储库接口并将其注入服务 class 但是我返回的对象是空的,这显然违背了目的。
如果你也能 link 给我一些教程,我会很高兴,因为我找不到任何与我的案例相关的教程。所有其他解释都描述了如何测试查询本身,这是我不想要的。我只需要一个对象。
如果我遗漏了一些明显的东西,我深表歉意,我在测试方面确实缺乏经验。
这是我的:
我的服务:
@Service
@Transactional(readOnly = true)
public class MyService{
@Autowired
private MyRepository repo;
public List<MyObj> findAll() {
return repo.findAll();
}
public MyObj findMyObjByCode(String code) {
return repo.findMyObjByCode(code);
}
}
测试:
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyObjTest{
@Test
void factoryTest() {
MyService service = new MyService ();
MyObj obj = service.findMyObjByCode("code");
MyDto dto = MyDto.from(obj);
//assertions
}
}
你知道吗@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE) 这将配置您的内存数据库?
为了连接到数据库,您需要在测试资源中使用数据库访问属性启动 spring 上下文,例如使用注释 @SpringBootTest。如果您想使用 class 也不要模拟 jparepository(否则它将 return 为空或模拟响应)。使用 @SpringBootTest 时,您需要 @Autowire 服务。如果你需要模拟一些服务,你只需要用 @MockBean
注释它
进行单元测试时,根本不需要处理真实数据。通过给你一种从数据库读取的方法来回答这个问题将完全没有抓住要点。如果一个人只是简单地测试一个对象是否存在,它是否拥有特定的属性,那么对象来自哪里有什么关系呢?可以创建一个类似于数据库中的测试对象,或者简单地使用 Mockito 框架中的模拟。在应该从数据库中检索真实对象的步骤中,可以简单地 return Mock 对象。
话虽如此,如果您仍想使用数据库,请参阅 java 中从数据库读取数据的教程。
CRUD 应用教程 - https://www.callicoder.com/spring-boot-jpa-hibernate-postgresql-restful-crud-api-example/
这里有一个可以使用 mocks - https://www.baeldung.com/mockito-series
我对单元测试或集成测试不是很有经验。我有以下场景:我只是想从我的数据库中获取一个对象用于测试。该对象不会更新,我懒得手动创建它,因为它很长class而且会很麻烦。
我从数据库中获取内容的结构是调用存储库接口的服务 class。现在我的问题是当我 运行 测试时存储库为空。
正在使用
@DataJpaTest
和
@AutoConfigureTestDatabase(replace = Replace.NONE)
我可以连接到我的数据库,但服务 class 中的存储库为空。
我尝试模拟存储库接口并将其注入服务 class 但是我返回的对象是空的,这显然违背了目的。
如果你也能 link 给我一些教程,我会很高兴,因为我找不到任何与我的案例相关的教程。所有其他解释都描述了如何测试查询本身,这是我不想要的。我只需要一个对象。
如果我遗漏了一些明显的东西,我深表歉意,我在测试方面确实缺乏经验。
这是我的:
我的服务:
@Service
@Transactional(readOnly = true)
public class MyService{
@Autowired
private MyRepository repo;
public List<MyObj> findAll() {
return repo.findAll();
}
public MyObj findMyObjByCode(String code) {
return repo.findMyObjByCode(code);
}
}
测试:
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyObjTest{
@Test
void factoryTest() {
MyService service = new MyService ();
MyObj obj = service.findMyObjByCode("code");
MyDto dto = MyDto.from(obj);
//assertions
}
}
你知道吗@DataJpaTest @AutoConfigureTestDatabase(replace = Replace.NONE) 这将配置您的内存数据库?
为了连接到数据库,您需要在测试资源中使用数据库访问属性启动 spring 上下文,例如使用注释 @SpringBootTest。如果您想使用 class 也不要模拟 jparepository(否则它将 return 为空或模拟响应)。使用 @SpringBootTest 时,您需要 @Autowire 服务。如果你需要模拟一些服务,你只需要用 @MockBean
注释它进行单元测试时,根本不需要处理真实数据。通过给你一种从数据库读取的方法来回答这个问题将完全没有抓住要点。如果一个人只是简单地测试一个对象是否存在,它是否拥有特定的属性,那么对象来自哪里有什么关系呢?可以创建一个类似于数据库中的测试对象,或者简单地使用 Mockito 框架中的模拟。在应该从数据库中检索真实对象的步骤中,可以简单地 return Mock 对象。
话虽如此,如果您仍想使用数据库,请参阅 java 中从数据库读取数据的教程。
CRUD 应用教程 - https://www.callicoder.com/spring-boot-jpa-hibernate-postgresql-restful-crud-api-example/
这里有一个可以使用 mocks - https://www.baeldung.com/mockito-series