无法模拟 crudrepository 保存方法

Posted

技术标签:

【中文标题】无法模拟 crudrepository 保存方法【英文标题】:unable to mock crudrepository save method 【发布时间】:2021-04-26 10:52:48 【问题描述】:
@ExtendWith(MockitoExtension.class)
class taskTestMain 

    @InjectMocks
    task task1;


    @Mock
    private statusRepository statusRepo;

    
    
    @Mock
     status statusRec;
    @Test
    void test() 
        Mockito.when(statusRepo.save(statusRec)).thenReturn(statusRec);

        task1.method();
    


class task

method()

statusRec = statusRepo.save(statusRec); //after this step I get Potential stubbing exception 


我尝试了几种方法。我无法弄清楚这一点。请建议如何进行。下面我粘贴了junit错误。任务 - 严格的存根参数不匹配。请检查:

此“保存”方法的调用:statusRepo.save(status@8bffb8b); -> 在 task.run(task.java:80) 具有以下具有不同参数的存根:1. statusRepo.save(status@26a2f7f9 ); -> 在 .taskTestMain.test(taskTestMain.java:110) 通常,存根参数不匹配表明用户在编写测试时犯了错误。 Mockito 会提前失败,以便您轻松调试潜在问题。

感谢您的宝贵时间

【问题讨论】:

错误很清楚,你有不同的论点。当您模拟保存方法时,您需要确保您传递的是相同的对象。因此你的equals和hashcode方法不好,先检查一下 【参考方案1】:

说实话,我对此并不完全确定,但我有一个猜测。

Mockito.when(statusRepo.save(statusRec)).thenReturn(statusRec);

有了这个存根,您只是想返回传递给save 方法的第一个参数?如果这是真的,那么有一种更通用的方法可以做到这一点。

when(statusRepo.save(any(TcMdhTotemConsensusStatus.class))).then(returnsFirstArg());

此存根将始终返回传递给您的save 的第一个参数 方法。 请参阅this *** post 了解更多信息。如果您的 Java 或 Mockito 版本不匹配,还有一些替代方案。

【讨论】:

谢谢 Jan. 这很有帮助

以上是关于无法模拟 crudrepository 保存方法的主要内容,如果未能解决你的问题,请参考以下文章

如何修复CrudRepository.save(java.lang.Object)是springboot中的无法访问方法?

CRUDRepository 中的 Update 或 saveorUpdate

Spring Data CrudRepository 的保存抛出 InvocationTargetException

Spring Data CrudRepository 作为方法 Bean

CrudRepository 无法在 h2 db 上执行任何查询

无法使用弹簧数据 jpa CrudRepository