![](/img/trans.png)
[英]How can I return an object from a POST method with Spring Boot?
[英]How can i make Testing in Spring boot when i have a Page<Object> as a return type
我正在尝试在我的服务 impl class 中测试我的保存方法。 它有 Page 作为返回类型。 测试成功,但我写错了,因为它在所有通常不应该的情况下都成功了请参阅下面的代码。
服务 Class 实施
@Service
@Transactional
public class CompanyServiceImpl implements CompanyService {
private final CompanyRepository companyRepository;
public CompanyServiceImpl(CompanyRepository companyRepository) {
this.companyRepository = companyRepository;
}
@Override
public Page<Company> findAll(Pageable pageable) {
Page<Company> result = companyRepository.findAll(pageable);
return result;
}
@Override
public Page<Company> searchCompany(String companyName, Long companyGroupId, Pageable pageable) {
Page<Company> result = companyRepository.findByParametersWeb(companyName,companyGroupId,pageable);
return result;
}
@Override
public Optional<Company> findById(Long id) {
Optional<Company> entity = companyRepository.findById(id);
return entity;
}
@Override
public Company save(Company company) {
Company entity = companyRepository.save(company);
return entity;
}
@Override
public void delete(Long id) {
companyRepository.deleteById(id);
}
}
测试服务 class
class CompanyServiceImplTest {
@Mock
private CompanyRepository companyRepository;
private CompanyService companyService;
private Company company;
@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
companyService = new CompanyServiceImpl(companyRepository);
company = new Company();
company.setName("company");
company.setCompanyGroupId(1L);
}
@Test
void searchCompany() {
List<Company> companies = new ArrayList<>();
Pageable pageable= PageRequest.of(0,5);
Page<Company> result = new PageImpl<>(companies,pageable,1);
when(companyRepository.findByParametersWeb(anyString(),anyLong(),any(Pageable.class))).thenReturn(result);
Page<Company> newResult = companyService.searchCompany("giorgos",1L,pageable);
assertEquals(newResult.getTotalElements(),result.getTotalElements());
}
}
最后是我的公司存储库
@Repository
public interface CompanyRepository extends JpaRepository<Company, Long> {
@Query("SELECT a FROM Company a WHERE (:name is null or ((a.name LIKE :name AND LENGTH(:name) > 0) OR ( a.name = '%')))")
List<Company> findByCompanyName(@Param("name") String name);
@Query("SELECT a FROM Company a WHERE (:name is null or (LENGTH(:name) > 0 " +
" AND ((:option = 'yes' AND a.name = :name) or (:option = 'start' AND a.name LIKE CONCAT(:name,'%')) " +
" or (:option = 'end' AND a.name LIKE CONCAT('%',:name)) or (a.name LIKE CONCAT('%',:name,'%'))))) " +
" AND (:companyGroupId is null or a.companyGroupId = :companyGroupId) ORDER BY a.name")
Page<Company> findByParametersWeb(String name,Long companyGroupId, Pageable pageable);
List<Company> findAllByNameOrderByName();
}
因此,您想在这里将单元测试与集成或组件测试区分开来。 您的测试将有资格作为单元测试,它仅测试与其他一切隔离的服务层的功能。
这也是您模拟存储库层以独立于数据库的原因。
与此相反,集成和组件测试测试您的整个应用程序堆栈。
为此,必须运行 spring 引导环境,因此您必须使用@ExtendWith(SpringExtension.class)
注释您的测试类。
对于此类测试,您需要一个活动数据库,因此通常您使用 h2 数据库进行测试,该数据库在测试之前填充了数据。 看看这个和这个。
在测试本身中,您要么注入服务并从那里进行测试,要么使用RestTemplate
调用端点。
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Sql("/schema.sql")
public class DocumentManagementBackendApplicationTest {
@Autowired
private final CompanyServiceImpl companyServiceImpl;
@Test
@Sql("/searchCompany.sql")
public void testSearchCompany() {
List<Company> companies = new ArrayList<>();
Pageable pageable= PageRequest.of(0, 5);
Page<Company> result = companyService.searchCompany("giorgos",1L,pageable);
// now here you know, based on what you insert into your db with your sql scripts,
// what you should expect and so you can test for it
(...)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.