【问题标题】:Equivalent of Mockito any with not null constraint等效于具有非空约束的 Mockito any
【发布时间】:2017-05-30 09:13:50
【问题描述】:

我正在编写最近几天的测试用例。我想知道 org.mockito.Matchers.any 有没有非空约束的等价物?

如果你说:

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

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

【问题讨论】:

  • 它是 Mockito 1.10.19。

标签: java unit-testing mockito powermock


【解决方案1】:

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

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

然后使用

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

我的一个建议是考虑一些您可以期望在那里作为方法输入的接口。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您在 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)
      
          // ...
      

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 2022-07-05
        相关资源
        最近更新 更多