当前位置: 首页 > 知识库问答 >
问题:

Mockito针对Spring数据JPA页面接口失败

狄晟睿
2023-03-14
@SpringBootTest
public class TestClass {

    @Mock
    private Page<Customer> pagedResult;

    @Mock
    private Pageable paging = PageRequest.of(0, 1);

    @Mock
    private CustomerRepository cutomerRepository;

    @InjectMocks
    private CustomerServiceImpl service;

    @Test
    void testss() {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        Pageable paging1 = PageRequest.of(0, 1);
        Page<Customer> pa = new PageImpl<>(Arrays.asList(customer));
        when(cutomerRepository.findByIdIn(set, paging1)).thenReturn(pa);
        when(service.test(set)).thenReturn(Arrays.asList(customer));
        assertEquals(customer.getName(), service.test(set).get(0).getgetName());
    }
}

实现类

public class CustomerServiceImpl {

    private CustomerRepository customerRepository ;

    public CustomerServiceImpl(CustomerRepository customerRepository ) {
        super();
        this.customerRepository = customerRepository ;
    }

    @Override
    public List<Customer> test(Set<Integer> ids) {
        Pageable paging = PageRequest.of(0, 1);
        Page<Customer> pagedResult = customerRepository.findByIdIn(ids, paging);
        return pagedResult.toList();
    }
}

我正在尝试使用mockito为我的分页代码编写Junit测试用例,但它失败了,因为它期望方法的返回类型为Page.但是我返回客户列表。

我得到以下错误

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ArrayList cannot be returned by findByIdIn()
findByIdIn() should return Page

如果您不确定为什么会出现上述错误,请继续阅读。由于语法的性质,可能会出现上述问题,因为:

>

  • 在错误编写的多线程测试中可能会发生此异常。有关并发测试的限制,请参阅莫基托常见问题解答。

    间谍使用当(间谍.foo()).then()语法进行存根。它更安全的存根间谍 - 与 do 回复|抛()系列方法。更多关于莫基托.spy()方法的爪哇多克斯。

  • 共有1个答案

    常坚
    2023-03-14

    我认为你的代码有问题。您的代码中有<code>doctorRepository。findByIdIn方法bt在您的测试类中,它是cutomerRepository.findByIdIn

    我已经添加了以下代码作为您的< code>CustomerServiceImpl的参考。< br >您可以尝试用同样的方法来执行测试。

    SpringBootTest
    public class TestClass {
        
        @Mock
        private Pageable paging;
    
        @Mock
        private CustomerRepository cutomerRepository;
        
        @Mock
        private DoctorRepository doctorRepository;
    
        @InjectMocks
        private CustomerServiceImpl service;
    
        @Test
        void testss() {
        
            Doctor doctor = new Doctor();
            doctor.setName("test name");
             
            Set<Integer> set = new HashSet<>();
            set.add(1);
            
            PageImpl<Doctor> page = new PageImpl<>(Arrays.asList(doctor));
            when(doctorRepository.findByIdIn(Mockito.any(), Mockito.any())).thenReturn(page);
            
            List<Doctor> doctors= service.test(set);
            
            assertEquals(doctor.getName(), doctors.get(0).getgetName());
        }
    }
    
     类似资料:
    • 我有一个名为user的实体,如下所示: 我还有一个用户摘要类,它旨在返回以进行分页和排序: 这与所有其他实体一起似乎在h2中很好地初始化,从控制台我看到如下内容: 和 甚至: 现在,我已经设置了控制器、服务和存储库... 控制器: 服务:公共接口UserService扩展了UserDetailsService{ 存储库:公共界面UserRepository扩展了JpaRepository{ 最后,

    • 在我的测试项目中,由于以下错误,Spring容器无法创建扩展JPararePository的bean。 原因:org.springframework.beans.factory.BeanCreationException:创建名为“sr svcInfomtrRepository”的bean时出错:FactoryBean在创建对象时引发异常;嵌套异常为java.lang.NosuchMethoder

    • 我得到了存储库代码: 当我在该查询上运行测试时,我得到了以下Hibernate警告:

    • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

    • 我对一些基本的Spring数据概念有点困惑。 据我所知,典型的DAO级别结构如下所示: 有了这个概念,我可以使用JPA作为第一个DAO接口的实现,使用JDBC作为第二个DAO接口的实现。 现在我想了解Spring存储库抽象。每个Spring Data tutorial都指定,我应该有一个接口,例如,该接口应该从JPararePository扩展。所以有了这个接口,我已经用JPA锁定了,对吧? 如果

    • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在