当前位置: 首页 > 面试题库 >

将仿制药与Mockito匹配

呼延修然
2023-03-14
问题内容

我正在尝试模拟restTemplate.exchangeSpring Rest 的方法。

在同一测试中,我有多个调用,它们的区别仅在于返回类型。

这是我创建的模拟方法

第一

// Original method
restTemplate.exchange(UrlMap.SEARCH + '?' + searchDocsForm.toQueryParams(),
            HttpMethod.GET, null, new ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>() {
            })
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>>any())).thenReturn(
            new ResponseEntity<>(searchResultsDTO, HttpStatus.OK));

第二

// Original method
restTemplate.exchange(UrlMap.ALL_DOCUS_TOPICS,
            HttpMethod.GET, null, new ParameterizedTypeReference<List<SelectItem>>() {
            }).getBody();
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<List<SelectItem>>>any())).thenReturn(
            new ResponseEntity<>(selectItems, HttpStatus.OK));

ParameterizedTypeReference模拟不考虑的通用参数,最后定义的模拟胜过前者。

有什么办法可以使其工作?


问题答案:

Mockito并不擅长匹配泛型本身,但是您的解决方案比一般情况要容易得多。

更换:

Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>>any())

与:

eq(new ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>() {}))

首先,Matchers.any()不匹配类型,甚至不匹配类型any(Foo.class)(从Mockito
1.x开始)。any()匹配所有值,包括null和不正确的类型:

匹配任何对象,包括空值

此方法不使用给定参数进行类型检查,仅在此位置使用,以避免强制转换代码。但是,在将来的主要版本中,可能会更改(可以添加类型检查)。

泛型有助于为exchange和获得正确的参数thenReturn,但是由于类型擦除,所有类型信息都无法将其放入CLASS文件中,更不用说JVM了。断言其参数类型的唯一Matcher是isA,它采用类文字,并且对参数化类型没有帮助。

您可以编写一个自定义的Matcher,以检查参数的类型和类型参数(如果它们不需要擦除),但是对于您的特定情况,则没有必要。

类型擦除是存在ParameterizedTypeReference的全部原因:它将泛型信息捕获到一个子类中,在该子类中
不会 删除参数化的类型。此相同的模式被用于TypeToken在番石榴或TypeLiteral在吉斯。所有这些实现都
将参数化类型描述为实例

重要的是,它们(包括ParameterizedTypeReference)都支持equalshashCode,即使实例不同,也new ParameterizedTypeReference<A<B>>(){}等于new ParameterizedTypeReference<A<B>>(){}。(请参见此处的代码。)

因为对相同参数化类型的引用相等,所以将Mockito的eq匹配器与其他引用一起使用,情况应该会很好。



 类似资料:
  • 虽然我确实理解泛型的一些常见情况,但我在下面的例子中遗漏了一些东西。 我有以下课程 第4行给出了错误 显然,编译器认为不同的并不真正相等。而我的直觉告诉我,这是正确的。 如果第4行是合法的,谁能提供一个我会得到运行时错误的例子? 编辑: 为了避免混淆,我用一个具体的赋值替换了第3行中的

  • 问题内容: JSR-299规范在第3.1节中规定: 如果托管bean类是泛型类型,则它必须具有范围@Dependent。如果带有参数化Bean类的托管Bean声明了@Dependent以外的任何范围,则容器将自动检测到该问题并将其视为定义错误。 有效地意味着您不能这样做: 做出此决定的技术原因是什么? 是否会在即将发布的CDI版本中对其进行补救? 有解决此问题的最佳实践吗? 谢谢 编辑 -我经常使

  • 我正在尝试结合Guice的这3个功能:注入,多重绑定,泛型。我创建了一个生产项目的原型,所以这里是: 首先,这是泛型的一个小层次结构(在生产案例中,有N个实体的层次结构): 接下来,类ToCreate1和ToCreate2我想创建的工厂。 基类: 它的继承者: 然后,工厂本身: 所以,现在我想注入一个map,包含< i>Factory 因此,我使用配置方法创建了Guice的抽象模块: 所以,我注入

  • 我使用通配符和列表上的下界泛型,但编译器抛出错误。 代码: 错误: 类型列表中的add(capture#8-of?super Integer)方法不适用于参数(Number) 与<代码>列表

  • 我有一个GWT应用程序,我从文本框中获取输入,检查正则表达式的值,如果匹配,然后我将该文本添加到表格中。当我为例如“你好”输入任何正确的输入时,它工作得非常好。 任何帮助都将不胜感激。

  • 如果null对象的string属性与预先确定的值不匹配,我有一个测试来验证该对象的返回。我的代码是