繁体   English   中英

当我有页面时,如何在 Spring 引导中进行测试<object>作为返回类型<div id="text_translate"><p>我正在尝试在我的服务 impl class 中测试我的保存方法。 它有 Page 作为返回类型。 测试成功,但我写错了,因为它在所有通常不应该的情况下都成功了请参阅下面的代码。</p><p> 服务 Class 实施</p><pre> @Service @Transactional public class CompanyServiceImpl implements CompanyService { private final CompanyRepository companyRepository; public CompanyServiceImpl(CompanyRepository companyRepository) { this.companyRepository = companyRepository; } @Override public Page&lt;Company&gt; findAll(Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findAll(pageable); return result; } @Override public Page&lt;Company&gt; searchCompany(String companyName, Long companyGroupId, Pageable pageable) { Page&lt;Company&gt; result = companyRepository.findByParametersWeb(companyName,companyGroupId,pageable); return result; } @Override public Optional&lt;Company&gt; findById(Long id) { Optional&lt;Company&gt; 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); } }</pre><p> 测试服务 class</p><pre> 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&lt;Company&gt; companies = new ArrayList&lt;&gt;(); Pageable pageable= PageRequest.of(0,5); Page&lt;Company&gt; result = new PageImpl&lt;&gt;(companies,pageable,1); when(companyRepository.findByParametersWeb(anyString(),anyLong(),any(Pageable.class))).thenReturn(result); Page&lt;Company&gt; newResult = companyService.searchCompany("giorgos",1L,pageable); assertEquals(newResult.getTotalElements(),result.getTotalElements()); } }</pre><p> 最后是我的公司存储库</p><pre>@Repository public interface CompanyRepository extends JpaRepository&lt;Company, Long&gt; { @Query("SELECT a FROM Company a WHERE (:name is null or ((a.name LIKE:name AND LENGTH(:name) &gt; 0) OR ( a.name = '%')))") List&lt;Company&gt; findByCompanyName(@Param("name") String name); @Query("SELECT a FROM Company a WHERE (:name is null or (LENGTH(:name) &gt; 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&lt;Company&gt; findByParametersWeb(String name,Long companyGroupId, Pageable pageable); List&lt;Company&gt; findAllByNameOrderByName(); }</pre></div></object>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM