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

使用自定义ArgumentMatcher

翟渝
2023-03-14

假设我有一个名为call的方法的接口,它接受了ServiceRequest的参数。在ServiceRequest中有名为field dAfield dB的字段。我想模拟调用此方法的响应,并返回不同的模拟响应结果,只要ServiceRequest中field dA的值不同。

我有以下代码,如follow(参考https://www.baeldung.com/mockito-argument-matchers),但它返回空指针异常。这里出了什么问题?

@Mock
private Service service;

@Test
public void testCustomMatcher() {
    ServiceRequest req1 = new ServiceRequest();
    req1.setFieldA(1);

    ServiceRequest req2 = new ServiceRequest();
    req2.setFieldA(2);

    when(service.call(argThat(new CustomArgMatcher(req1)))).thenReturn("mockResp1");
    when(service.call(argThat(new CustomArgMatcher(req2)))).thenReturn("mockResp2");
}

public class CustomArgMatcher implements ArgumentMatcher<ServiceRequest> {
    private ServiceRequest left;

    public CustomArgMatcher(ServiceRequest s) {
        this.left = s;
    }

    @Override
    public boolean matches(ServiceRequest serviceRequest) {
        return left.getFieldA() == serviceRequest.getFieldA();
    }
}

interface Service {
    String call(ServiceRequest request);
}

public class ServiceImpl implements Service {

    @Override
    public String call(ServiceRequest request) {
        return "sample";
    }
}

public class ServiceRequest {
    private int fieldA;
    private int fieldB;

    public int getFieldA() {
        return fieldA;
    }

    public void setFieldA(int fieldA) {
        this.fieldA = fieldA;
    }

    public int getFieldB() {
        return fieldB;
    }

    public void setFieldB(int fieldB) {
        this.fieldB = fieldB;
    }
}

共有1个答案

宋博易
2023-03-14

我看到两个问题:

>

ArgumentMatcher必须以某种方式表现得像equals(...):它还必须接受null作为参数,而不引发异常

查看匹配项的JavaDoc:

如果参数不匹配,则该方法不应断言。它应该只返回false。

试着用这个:

return (null != serviceRequest) && (left.getFieldA() == serviceRequest.getFieldA());

作为一个nullServiceRequest对象永远不会匹配任何东西,在这种情况下,它将返回false

 类似资料:
  • 问题内容: 是否可以使用Java API创建索引并指定自定义分析器?它支持在索引创建时添加映射,但是我找不到不通过HTTP PUT发送JSON的方法来执行以下操作: 我可以使用JSONBuilder构建这样的查询,但是据我所知,我在API中找不到运行它的位置,没有可以使用的任何东西,也没有可以使用的地方。什么是正确的方法? 问题答案: 您可以使用设置分析仪。有几种建立设置的方法。您可以从文本,地图

  • 包的声明和使用非常简单,在了解基本语法之后,下面通过一个案例演示在 Java 程序中声明包,以及不同包之间类的使用。 1)创建一个名为 com.dao 的包。 2)向 com.dao 包中添加一个 Student 类,该类包含一个返回 String 类型数组的 GetAll() 方法。Student 类代码如下: 3)创建 com.test 包,在该包里创建带 main() 方法的 Test 类。

  • 本章节中,简述自定义类的创建和使用方法,供参考。 创建自定义类 用户可以定义自己的类,通过继承 ThingJS 内部类(比如:Thing 类),对 ThingJS 进行扩展和封装。 我们推荐使用 ES6 语法定义一个类。例如,自定义汽车类 Car。 // 继承 Thing 类 class Car extends THING.Thing { constructor(app) { super(

  • 问题内容: 我看到一些新网站在其网站上使用自定义字体(常规Arial,Tahoma等除外)。 并且它们支持大量的浏览器。 怎么做到的?同时,如果可能的话,还会阻止人们自由下载字体。 问题答案: 通常,您可以在CSS中使用自定义字体。这是一个非常基本的示例: 然后,简单地在特定元素上使用字体: (是您的选择器)。 请注意,某些字体格式并非在所有浏览器上都有效;您可以使用fontsquirrel.co

  • 问题内容: 我正在尝试在Go中创建和使用自定义包。这可能很明显,但是我找不到很多信息。基本上,我在同一个文件夹中拥有这两个文件: mylib.go main.go 当我尝试时,出现此错误: 我尝试先运行,但似乎没有做任何事(没有生成文件,没有错误消息)。所以有什么想法我该怎么做? 问题答案: 首先,请务必阅读并理解“如何编写Go代码”文档。 实际答案取决于您“定制包装”的性质。 如果打算用于一般用

  • 问题内容: 在我的html中,我很好奇使用唯一标识符(例如 保存图片)而不是语义是否正确。例如: 是否优先拥有: 与CSS: 而不是:我目前有: 与CSS: 唯一标识符的使用在语义上是否正确? 问题答案: 最好避免使用自定义标签,因为您永远不知道这些标签何时会标准化,并在将来有特殊用途。 如果要避免使用标头标记,对于您的示例最好的操作如下: 此外: 如果在设计页面时不使用标准html标记,则在禁用