是否有针对varargs阵列的Mockito eq匹配器? [英] is there Mockito eq matcher for varargs array?

查看:162
本文介绍了是否有针对varargs阵列的Mockito eq匹配器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试将作为参数传递的数组匹配到接收varargs数组的方法时,我遇到了问题。

I have a problem when trying to match an array that is passed as a parameter to a method that receives a varargs array.

其他问题/答案中提到的anyVararg()匹配器对我不起作用,因为我想确保提供的数组是我的需要。

我将问题简化为这个更容易理解和抽象问题的例子(我的真正问题是生产代码并具有业务逻辑,所以它为了这个问题的目的会令人困惑):

I reduced the problem to this example which is easier to understand and abstracts the problem (my real issue is production code and has busines logic so it would be confusing for the purpose of this question):

@RunWith(MockitoJUnitRunner.class)
public class UnitTest {
    private Object[] objectArray;
    private List<Object> expected;
    private TestTarget target;

    @Before
    public void setUp() {
        objectArray = new Object[]{ new Object() };
        expected = Arrays.asList(new Object(), new Object());
        target = Mockito.spy(new TestTarget());
    }

    @Test
    public void testMakeList() { // this pass as eq works well with normal array
        doReturn(expected).when(target).toList(Mockito.eq(objectArray));
        Assert.assertEquals(expected, target.makeList(objectArray));
    }

    @Test
    public void testMakeList1() { // this one fails as eq is not working with varargs
        doReturn(expected).when(target).toList1(Mockito.eq(objectArray));
        Assert.assertEquals(expected, target.makeList1(objectArray));
    }

    @Test
    public void testMakeListWithAryEq() { // fails, aryEq is not working with varargs
        doReturn(expected).when(target).toList1(AdditionalMatchers.aryEq(objectArray));
        Assert.assertEquals(expected, target.makeList1(objectArray));
    }

    private class TestTarget {
        public List<Object> makeList(Object[] objects) {
            return toList(objects);
        }

        public List<Object> makeList1(Object[] objects) {
            return toList1(objects);
        }

        protected List<Object> toList(Object[] objs) {
            return null;  // Not implemented "Intentionally"
        }

        protected List<Object> toList1(Object... objs) {
            return null;  // Not implemented "Intentionally"
        }
    }
}

当我在类中运行测试用例时,第一个测试用例将通过而不是其他两个,既不使用eq也不使用aryEq。显示以下跟踪:

When I run the test cases in the class, the first test case will pass but not the other two, neither using eq nor using aryEq. Showing the following trace:

java.lang.AssertionError: expected:<[java.lang.Object@56d5e457, java.lang.Object@7482384a]> but was:<null>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:743)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    ...

这是因为eq匹配器不使用varargs数组,是否有替代此用例的eq匹配器?

This happens because the eq matcher is not working with varargs arrays, is there any alternative to the eq matcher for this use case?

推荐答案

好的,我认为这里的答案需要一个自定义构建的匹配器,可以在单元测试中实现:

Ok, I think the answer here requires a custom built matcher, which can be implemented in your unit test as so:

private class MyVarargMatcher extends ArgumentMatcher<Object[]> implements VarargMatcher {
    private Object[] expectedValues;

    MyVarargMatcher(Object... expectedValues) {
        this.expectedValues = expectedValues;
    }

    @Override
    public boolean matches(Object varargArgument) {
        return new EqualsBuilder()
        .append(expectedValues, varargArgument)
        .isEquals();
    }
}

然后,在 testMakeList1( )将第一行更改为:

Then, in testMakeList1() change the first line to this:

Mockito.doReturn(expected).when(target).toList1(Mockito.argThat(new MyVarargMatcher(objectArray)));

来源:

如何正确匹配Mockito中的varargs

http://maciejmadej.blogspot.com/2011/11/capturing-varargs-argument-using-custom。 html

这篇关于是否有针对varargs阵列的Mockito eq匹配器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆