Mockito没有注入存储库模拟

时间:2018-04-19 11:46:09

标签: unit-testing spring-boot repository mockito

我正在尝试为具有存储库的spring boot应用程序编写测试。 我的测试类看起来像这样:

package se.volvo.spp.controller.spp;

import com.datastax.driver.core.utils.UUIDs;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.cassandra.repository.MapId;
import org.springframework.data.cassandra.repository.support.BasicMapId;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import se.volvo.spp.BaseTest;
import se.volvo.spp.config.JacksonConfig;
import se.volvo.spp.dao.cassandra.*;
import se.volvo.spp.dto.ServiceAgentDTO;
import se.volvo.spp.exception.NotFoundException;
import se.volvo.spp.repository.AssignmentRepository;
import se.volvo.spp.repository.ServiceAgentRepository;
import se.volvo.spp.service.impl.ServiceAgentService;

import javax.inject.Inject;
import java.util.*;

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

public class ServiceAgentControllerTest  extends BaseTest {

    @Autowired
    private MockMvc mockMvc;

    @Mock
    ServiceProviderDAO serviceProviderDAO;

    @Mock
    ServiceTypeDAO serviceTypeDAO;

    @Mock
    ServiceDefinitionDAO serviceDefinitionDAO;

    @Mock
    ServiceAgentDAO serviceAgentDAO;

    @Mock
    AssignmentDAO assignmentDAO;

    @Mock
    ServiceAgentRepository serviceAgentRepository;

    @Mock
    AssignmentRepository assignmentRepository;

    @InjectMocks
    ServiceAgentService serviceAgentService;

    @Before
    public void setUp() {

        serviceAgentDAO.setId(UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b"));
        serviceAgentDAO.setContactEmail("joe.smith@arwe.com");
        serviceAgentDAO.setContactTelephone("0735333333");
        serviceAgentDAO.setEnabled(true);
        serviceAgentDAO.setFirstNames("Joe");
        serviceAgentDAO.setLastName("Smith");
        serviceAgentDAO.setServiceDefinitionIds(Arrays.asList(UUID.fromString("9a9cb34a-4221-11e8-842f-0ed5f89f718b")));

        assignmentDAO.setId(UUID.fromString("69f7cd9c-423f-11e8-842f-0ed5f89f718b"));
        assignmentDAO.setCustomerId(UUID.fromString("7b479d52-423f-11e8-842f-0ed5f89f718b"));
        assignmentDAO.setCustomerName("John Gill");
        assignmentDAO.setServiceAgentId(UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b"));
        assignmentDAO.setServiceDefinitionId(UUID.fromString("9a9cb34a-4221-11e8-842f-0ed5f89f718b"));
        assignmentDAO.setServiceSlotId(UUID.fromString("a7ff6543-4236-11e8-8706-313df4405fc7"));
        assignmentDAO.setVehicle("WIN898987686");

        /*when(serviceAgentRepository.findOne(BasicMapId.id("id", Mockito.any(UUID.class)))).thenAnswer(new Answer() {
            @Override
            public ServiceAgentDAO answer(InvocationOnMock invocationOnMock) throws Throwable {
                System.out.println("ARGUMENT IS OUTSIDE :: "+(String)invocationOnMock.getArguments()[0]);
                if(((String)invocationOnMock.getArguments()[0]).equals(UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b"))) {
                    System.out.println("ARGUMENT IS :: "+invocationOnMock.getArguments()[0]);
                    return serviceAgentDAO;
                }
                else
                    throw new NotFoundException("The Service Agent ID does not exist!");

            }
        }
        );*/

        //when(serviceAgentRepository.findOne(BasicMapId.id("id", AdditionalMatchers.not(Matchers.eq(UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b")))))).thenThrow (new NotFoundException("The ServiceAgent with that ID does not exist!"));
        when(serviceAgentRepository.findOne(BasicMapId.id("id", UUID.class))).thenReturn (serviceAgentDAO);

        List<AssignmentDAO> assignmentDAOList = Arrays.asList(assignmentDAO);

        when(assignmentRepository.findByServiceAgentId(UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b"))).thenReturn(assignmentDAOList);

        assignmentDAO.setServiceAgentId(null);

        when(assignmentRepository.save(Mockito.any(AssignmentDAO.class))).thenReturn(assignmentDAO);

        serviceAgentDAO.setEnabled(false);

        when(serviceAgentRepository.save(Mockito.any(ServiceAgentDAO.class))).thenReturn(serviceAgentDAO);

    }

    @Test
    public void testServiceAgentNotFound() throws Exception {

        ObjectMapper objectMapper = JacksonConfig.createMapper();
        ServiceAgentDTO serviceAgentDTO = new ServiceAgentDTO();
        serviceAgentDTO.setEnabled(false);

        this.mockMvc.perform(patch("/serviceagent/" + UUIDs.timeBased())
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(serviceAgentDTO))).andDo(print())
                .andExpect(status().isNotFound());
    }

    @Test
    public void testServiceAgentIDNotAllowedInRequest() throws Exception {

        ObjectMapper objectMapper = JacksonConfig.createMapper();
        ServiceAgentDTO serviceAgentDTO = new ServiceAgentDTO();
        serviceAgentDTO.setId(UUIDs.timeBased());
        serviceAgentDTO.setEnabled(false);

        this.mockMvc.perform(patch("/serviceagent/" + UUIDs.timeBased())
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(serviceAgentDTO))).andDo(print())
                .andExpect(status().isBadRequest());

    }

    /*
        test to verify if the agent is disabled, then the agent is removed on his assignments as well
     */

    @Test
    public void testServiceAgentDisabledFromEnabled() throws Exception {

        ObjectMapper objectMapper = JacksonConfig.createMapper();

        // add a service provider

        serviceProviderDAO.setId(UUID.fromString("8890e560-4170-11e8-a465-3f3e0c8fed10"));
        serviceProviderDAO.setContactAddress("Torsgatan 190");
        serviceProviderDAO.setContactTelephone("073q12345678");
        serviceProviderDAO.setEnabled(true);
        serviceProviderDAO.setName("Cleany Car");

        // add a service type

        serviceTypeDAO.setId(UUID.fromString("e3e0c006-4220-11e8-842f-0ed5f89f718b"));
        serviceTypeDAO.setEnabled(true);
        serviceTypeDAO.setName("Refuel Benzene 95");
        serviceTypeDAO.setParentServiceTypeId(UUID.fromString("c1ecdf7a-4220-11e8-842f-0ed5f89f718b"));
        serviceTypeDAO.setScopes(Arrays.asList("UNLOCK", "LOCK"));

        // add service definition

        serviceDefinitionDAO.setId(UUID.fromString("9a9cb34a-4221-11e8-842f-0ed5f89f718b"));
        serviceDefinitionDAO.setEnabled(true);
        serviceDefinitionDAO.setGeographicAvailability(null);
        serviceDefinitionDAO.setLeadTimesInHours(24);
        serviceDefinitionDAO.setMaxAdvanceTimeInDays(7);

        Map<Integer, String> operatingWeekMap = new HashMap<>();
        operatingWeekMap.put(1, "10:00&17:00");
        operatingWeekMap.put(2, "09:00&17:00");
        operatingWeekMap.put(3, "09:00&17:00");
        operatingWeekMap.put(4, "09:00&17:00");
        operatingWeekMap.put(5, "09:00&17:00");
        operatingWeekMap.put(6, "11:00&17:00");
        operatingWeekMap.put(7, "09:00&17:00");

        serviceDefinitionDAO.setOperatingWeek(operatingWeekMap);
        serviceDefinitionDAO.setServiceProviderId(UUID.fromString("8890e560-4170-11e8-a465-3f3e0c8fed10"));
        serviceDefinitionDAO.setServiceSlotDurationInMinutes(60);
        serviceDefinitionDAO.setServiceTypeId(UUID.fromString("e3e0c006-4220-11e8-842f-0ed5f89f718b"));
        serviceDefinitionDAO.setTimeZoneId("Europe/London");

        // we do not populate service slot as of now, since we just need to disable agent!

        ServiceAgentDTO serviceAgentDTO = new ServiceAgentDTO();
        serviceAgentDTO.setEnabled(false);

        this.mockMvc.perform(patch("/serviceagent/" + UUID.fromString("e5cec1dc-422b-11e8-842f-0ed5f89f718b"))
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(serviceAgentDTO))).andDo(print())
                .andExpect(status().isOk());

    }

}

ServiceAgentService类已经为存储库注入了构造函数。

由于某种原因,我在setup()方法中的模拟存储库不会生效。

此外,BaseTest类如下所示

package se.volvo.spp;

import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = Application.class)
@AutoConfigureMockMvc
@ActiveProfiles("dev")

@Ignore
public class BaseTest {
}

非常感谢任何帮助!

0 个答案:

没有答案