Search code examples
javaspringunit-testingmockitohamcrest

How do I simplify mockito/hamcrest argument matchers in test method?


The test method below appear in a spring-guide tutorial. Is there a less convoluted syntax to write this test or how can I break it apart into smaller chunks?

verify(orderService).createOrder(
      org.mockito.Matchers.<CreateOrderEvent>argThat(
        allOf( org.hamcrest.Matchers.<CreateOrderEvent>
            hasProperty("details",
                hasProperty("dateTimeOfSubmission", notNullValue())),

        org.hamcrest.Matchers.<CreateOrderEvent>hasProperty("details",
                hasProperty("name", equalTo(CUSTOMER_NAME))),

        org.hamcrest.Matchers.<CreateOrderEvent>hasProperty("details",
                hasProperty("address1", equalTo(ADDRESS1))),
        org.hamcrest.Matchers.<CreateOrderEvent>hasProperty("details",
                hasProperty("postcode", equalTo(POST_CODE)))
    )));

Solution

  • You could switch the hasProperty and the allOf matchers.

    verify(orderService).createOrder(
          org.mockito.Matchers.<CreateOrderEvent>argThat(
            org.hamcrest.Matchers.<CreateOrderEvent>hasProperty("details",
              allOf(
                hasProperty("dateTimeOfSubmission", notNullValue()),
                hasProperty("name", equalTo(CUSTOMER_NAME)),
                hasProperty("address1", equalTo(ADDRESS1)),
                hasProperty("postcode", equalTo(POST_CODE)))
        )));