等效的Mockito任何非空约束

时间:2017-01-15 12:21:33

标签: java unit-testing mockito powermock

我正在编写过去几天的测试用例。我想知道是否有org.mockito.Matchers.any等效的非约束条件?

我的意思是,如果你说:

when(reviewBuilder.saveReviewModel(any())).thenReturn(2L);

然后saveReviewModel可以接受包括null在内的任何对象。有没有办法只将非空对象传递给使用Mockito 1.10.19库的方法?

3 个答案:

答案 0 :(得分:3)

您可以编写将通过此条件的自定义匹配器。

 class NotNullObjects extends ArgumentMatcher<Review> {
     public boolean matches(Object object) {
         return object!=null;
     }
 }

然后使用

when(reviewBuilder.saveReviewModel(argThat(new NotNullObjects()))).thenReturn(2L);

我的一个建议是考虑一些你可以期待的接口,作为你的方法的输入。

答案 1 :(得分:0)

如果您在verify方法调用中指定参数的预期类型,则此方法有效:

import static org.junit.Assert.fail;

import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

public class MockitoNotNullTest {

    private static class Dependency1 {

    }

    private static class Dependency2 {
        public void doesNotAcceptNull(Dependency1 d) {

        }
    }

    private static class ClassUnderTest {
        private final Dependency2 d2;

        public ClassUnderTest(Dependency2 d2) {
            this.d2 = d2;
        }

        public void passesNull() {
            d2.doesNotAcceptNull(null);
        }

    }

    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();
    @Mock
    Dependency2 d2;

    @Test
    public void passesNull_callsD1WithNull_verifyFails() {
        ClassUnderTest classUnderTest = new ClassUnderTest(d2);

        classUnderTest.passesNull();

        // fails as expected
        Mockito.verify(d2).doesNotAcceptNull(Mockito.any(Dependency1.class));
    }

}

结果是:

Argument(s) are different! Wanted:
d2.doesNotAcceptNull(
    <any stackoverflow.MockitoNotNullTest.Dependency1>
);
-> at stackoverflow.MockitoNotNullTest.passesNull_callsD1WithNull_verifyFails(MockitoNotNullTest.java:48)
Actual invocation has different arguments:
d2.doesNotAcceptNull(
    null
);
-> at stackoverflow.MockitoNotNullTest$ClassUnderTest.passesNull(MockitoNotNullTest.java:32)

    // ...

答案 2 :(得分:0)

在Mockito 1.9.5中,有isNotNull()isNotNull(java.lang.Class clazz)进行空值检查。

从版本2.1.0开始,anyX()和any(SomeType.class)匹配器拒绝空值并检查类型。请参见 Mockito 2的新功能页面上的Incompatible changes with 1.10段落。