简体   繁体   中英

How can I test in this situation in java?

I'm making a test for a service with a mock.

The problem is to create and inject instance directly from the class to test.

The source is shown below.

public OrderOutDTO createOrder(OrderSessionDTO orderSessionDTO) {
        Order order = orderRepository.save(new Order(orderSessionDTO));
        CreateOrderResDTO callServiceOrder = callService.createOrder(new CreateOrderReqDTO(order));
        CreateOrderReqDTO createOrderReqDTO = mock(CreateOrderReqDTO.class);
        createTrace(order, callServiceOrder.getData().getReceipt().getTransactionHash(), Trace.PUBLIC);
        return new OrderOutDTO(order, null);
    }

and test source is shown below.

    @Test
    public void createOrder() {

        // given
        CallService callService = mock(CallService.class);
        CreateOrderResDataDTO createOrderResDataDTO = mock(CreateOrderResDataDTO.class);

        // when
        when(callService.createOrder(createOrderReqDTO)).thenReturn(createOrderResDTO);

        OrderOutDTO order = orderService.createOrder(orderSessionDTO);

        // then
        assertThat(order, is(Matchers.notNullValue()));
        assertThat(order.getOrder(), is(Matchers.notNullValue()));
        assertThat(order.getOrder().getReceiver().getName(), is("test"));
    }

I thought this test would finish well. But in the code below, it returned null and failed.

// callService.createOrder(new CreateOrderReqDTO(order)) return null
CreateOrderResDTO callServiceOrder = callService.createOrder(new CreateOrderReqDTO(order)); 

It doesn't seem to recognize it because the service injects a new instance. I want the mock data returned. What should I do?

In the following line you're mocking behavior on createOrderReqDTO as param:

when(callService.createOrder(createOrderReqDTO)).thenReturn(createOrderResDTO);

whereas further, you're passing some other object:

OrderOutDTO order = orderService.createOrder(orderSessionDTO);

This behavior is not recognized, you would have to pass the same thing you mocked before.

I found it myself!

I use argumentMatchers.

when(callService.createOrder(createOrderReqDTO)).thenReturn(createOrderResDTO);

to

when(callService.createOrder(any())).thenReturn(createOrderResDTO);

thank you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM