Mockito anyListOf Pair类

问题描述 投票:1回答:3

A类-具有'doSomething'方法,该方法接受对的列表

B类-具有内部调用A类方法的方法。

我正在尝试为Class B编写Junit,在这里我需要验证模拟对Class A的方法是使用Pair类型调用的。

verify(a,times(1)).doSomething(Mockito.anyListOf(Pair.class))

我需要一种指定类似方法的方法

verify(a,times(1)).doSomething(Mockito.anyListOf(Pair<CustomClass1,CustomClass2>.class))
java junit mockito
3个回答
0
投票

Java不会让一个类具有相同擦除的两个方法;因此,只要调用doSomething(List),它将带有List<Pair<CustomClass1,CustomClass2>>

因此,您应该只可以使用:

verify(a,times(1)).doSomething(Mockito.anyList());

或者,如果没有doSomething的其他单参数重载:

verify(a,times(1)).doSomething(Mockito.any());

0
投票

可以使用

verify(a, times(1)).doSomething(Mockito.argThat(<HERE_COMES_ARGUMENT_MATCHER_INSTANCE>)); // see below

ArgumentMatcher是嘲笑用来实现自定义验证逻辑的抽象:

private class MyMatcher extends ArgumentMatcher<List<Pair>> {
    private final List<Pair> expected; 

    public PointMatcher(List<Pair> expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object obj) {
        if (!(obj instanceof List<Pair>)) {
            return false;
        }
        List<Pair>actual = (List<Pair>) obj;

        return // implement your custom logic here and return boolean if it matches
    }
}

在此特定示例中,我使用了一个匹配器,可以将实际列表与期望的列表进行比较,但是您可以创建一个匹配器,该匹配器确实具有“较弱”的比较标准。


0
投票

不是真正的问题答案,而是替代方法(可能是一个更好的选择)。我最终使用Argument Captor捕获参数,然后可以声明捕获的值以验证它们是否与期望值匹配。

@Captor
private ArgumentCaptor<List<Pair<CustomClass1, CustomClass2>>> pairListArgCaptor;

//Capture Values
verify(a,times(1)).doSomething(pairListArgCaptor.capture());

assertEquals(expectedCustomObject1,pairListArgCaptor.get().get(0).getFirst());
assertEquals(expectedCustomObject2,pairListArgCaptor.get().get(0).getSecond());
热门问题
推荐问题
最新问题