java - 如何使用 mockito 模拟存储库方法而不考虑参数

标签 java spring-boot mockito spring-repositories crud-repository

我正在使用 spring 框架并使用 Junit 和 mockito 进行测试。

现在我的服务中有一个方法,它使用我在测试中创建的几个对象,我们称它们为 configObject1 和 configObject2,我将它们作为参数发送给方法,然后该方法开始调用沿着这些配置对象的另一个存储库,这些存储库被模拟并且运行良好,该方法从这些查询/配置对象中生成“CalculusResult”列表。之后,我使用一个扩展 CRUDRepository 的存储库并创建一个 saveAll()。然后它应该返回一个带有实体的迭代器,但由于某种原因在 saveAll 方法之后它返回一个空列表。

测试:

@Test
...
configObject1 conf1 = new configObject1 (...);
configObject2 conf2 = new configObject2 (...);
Calculusresult calcRes = new CalculusResult(null,...,new java.sql.Date(system.currentTimeMilis()),...);
List<CalculusResult> resList= new ArrayList<CalculusResult>();
resList.add(calcRes);

Calculusresult calcRes2 = new CalculusResult(1,...,new java.sql.Date(system.currentTimeMilis()),...);
List<CalculusResult> resList2= new ArrayList<CalculusResult>();
resList2.add(calcRes2);

when(calculusResultRepository.saveAll(resList)).thenReturn(resList2);
...
assertTrue(!response.isEmpty())

服务中的方法:

...//The method is building the list of calculusResults
resCalc.setDate(new java.sql.Date(system.currentTimeMilis()))
resList.add(calcres);//CalculusResult object is added to the list, this object is well made
List<CalculusResult> savedResults = (List<CalculusResult>) calculusResultRepository.saveAll(resList); //This returns an empty list (If I don't cast, it also returns nothing)

for(CalculusResult calcres : savedResults){
... //This makes nothing because savedResults is empty, making the response empty and failing the test.

存储库:

@Repository
public interface CalculusResultRepository extends CrudRepository<CalculusResult, Long> {

}

我不确定,但我认为问题可能是我在测试中创建的对象与服务中的对象不同,因为其中一个属性是它创建时的 sql 日期,所以也许它不会在测试中触发“when(calculusRepository.saveAll(reslist)...”,因为在测试中创建的对象和在服务中创建的对象在该属性中具有不同的日期。

如果是这样的话,有什么办法可以解决吗?还是问题完全不同?

最佳答案

您可以使用 Mockito ArgumentMatchers 来匹配任何参数。

when(calculusResultRepository.saveAll(Mockito.any(List.class)))
    .thenReturn(resList2);

关于java - 如何使用 mockito 模拟存储库方法而不考虑参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70296966/

相关文章:

java - 使用关系和 @JsonIdentityInfo 进行 JSON 序列化

Spring SavedRequest 知道 X-Forwarded-Prefix

java - 从 SDN+OGM 切换到 SDN/RX 时替换 @QueryResult

java - 定义模拟后,我可以设置/更改模拟的返回值吗?

java模拟: is there a way to fake a class that doesnt exists?

java - 如何在 @Configuration/@Bean 使用的单元测试中禁用 Spring Autowiring

Java:这些构造方法有什么区别

Java Swing : How to refresh JTable Model from another page button

访问数据库的 Java 有效策略

java - Android中的简单音频播放停止