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

Mockito匹配任何类参数

黄鸣
2023-03-14
问题内容

有没有办法匹配以下示例例程的任何类参数?

class A {
     public B method(Class<? extends A> a) {}
}

无论传递到哪个类,如何 始终 返回a ?以下尝试仅适用于匹配的特定情况。new B()``method``A

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);

编辑 :一种解决方案是

(Class<?>) any(Class.class)

问题答案:

还有两种方法(请参阅我对@Tomasz Nurkiewicz的先前回答的评论):

第一个依据的事实是编译器根本不会让您传递错误的类型:

when(a.method(any(Class.class))).thenReturn(b);

您会丢失准确的输入(Class<? extends A>),但可能会按需要使用。

第二个涉及更多,但如果您 确实 要确保to的参数method()是的A或的子类,则可以说是更好的解决方案A

when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);

其中ClassOrSubclassMatcherorg.hamcrest.BaseMatcher定义为:

public class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {

    private final Class<T> targetClass;

    public ClassOrSubclassMatcher(Class<T> targetClass) {
        this.targetClass = targetClass;
    }

    @SuppressWarnings("unchecked")
    public boolean matches(Object obj) {
        if (obj != null) {
            if (obj instanceof Class) {
                return targetClass.isAssignableFrom((Class<T>) obj);
            }
        }
        return false;
    }

    public void describeTo(Description desc) {
        desc.appendText("Matches a class or subclass");
    }       
}

!我会选择第一个选项,直到您 真正 需要更好地控制method()实际返回的内容为止:-)



 类似资料:
  • 问题内容: 我有这样声明的方法 这个枚举 问题:如何模拟通话?我无法比拟。 以下无效: 问题答案: 将达到目的: 附带说明:考虑使用静态导入: 模拟变得更短:

  • 我用的是带Scalatest的mockito。我有以下问题时使用匹配值类。 结果是:

  • 我试图使用Mockito来模拟一个方法,但是,我不断地出错。我试图用spring注释设置Mockito @RunTo(MockitoJUnitRunner.class)类CPEServiceInvokerInimplNewTest{ 然后我用这个Mockito调用- 尝试并模仿这种方法- 我得到了这个错误- 如果匹配器与原始值组合,则可能会发生此异常://不正确:somethod(anyObjec

  • 我试图模拟Spring Rest的方法。 在同一个测试中,我有多个调用,它们的不同之处在于返回类型。 mock不考虑的泛型参数,最后定义的mock胜过前者。 有什么办法能让它起作用吗?

  • 问题内容: 争论的Mockito匹配器(如,,,,和)从Hamcrest匹配器表现非常不同。 匹配器经常导致,即使在使用任何匹配器很长时间后执行的代码中也是如此。 匹配器遵循怪异的规则,例如,如果给定方法中的一个参数使用匹配器,则仅要求对所有参数使用Mockito匹配器。 当覆盖或使用时,匹配器可能导致 。 使用Mockito匹配器以某些方式重构代码会产生异常和意外行为,并且可能会完全失败。 为什

  • 问题内容: 在.net中,您可以使用它来匹配任何字母,如何在Python中进行匹配?即,我想匹配任何大写,小写和带重音的字母。 问题答案: Python的模块尚不支持Unicode属性。但是您可以使用该标志编译正则表达式,然后字符类速记也将与Unicode字母匹配。 由于还将匹配数字,因此您需要从字符类中减去数字以及下划线: 将匹配任何Unicode字母。