Как смоделировать исключение в контроллере отдыха, где исключение выдается из службы - PullRequest
1 голос
/ 08 апреля 2020

Я работаю над написанием тестовых примеров для остальных контроллеров при загрузке Spring.

Чтобы дать некоторое представление о проблеме, я не могу смоделировать исключение, которое было сгенерировано из службы на уровне контроллера.

Я использую PowerMokito для написания тестовых случаев.

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserApiController.class)
public class UserApiControllerTest {


   /* private MockMvc mockMvc;*/
    @Mock
    GenericService genericService;

    @Mock
    UserService userService;

    @Mock
    UserRoleService userRoleService;

    @Mock
    MessageService messageService;

    @Mock
    CurrentUserService currentUserService;

    @Mock
    UserRepository userRepository;

    @Mock
    UserRoleRepository userRoleRepository;

    @InjectMocks
    UserApiController userApiController;


    @Before
    public void setup() {
        // this must be called for the @Mock annotations above to be processed
        MockitoAnnotations.initMocks(this);
        //Set up mocking for repository methods
    }

    @Test(expected = DuplicateUserEmailException.class)
    public void saveUserByEmailFailure() throws Exception {
        HashMap mockUser = new HashMap<String,Object>();
        mockUser.put("email","test_dy1@gmail.com");
        String user = new ObjectMapper().writeValueAsString(mockUser);
        doThrow(new DuplicateUserEmailException()).
                when(userService).saveUserByEmailId(any());

        userApiController.saveUserByEmailId(user);
    }

Пожалуйста, найдите детали контроллера ниже.

    @RequestMapping(value = "/save_user_by_email", method = RequestMethod.POST)
    public String saveUserByEmailId(@RequestParam("user") String user) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        HashMap<String, Object> userJson = new HashMap<String, Object>();
        userJson = mapper.readValue(user, new TypeReference<Map<String, Object>>(){});
        JsonObjectBuilder responseBuilder = Json.createObjectBuilder();
        try {
            userService.saveUserByEmailId(userJson);
            responseBuilder.add("success", true).add("code", genericService.getSuccessCode()).add("message",
                    userJson.containsKey("id") ? messageService.getMessage("message.success.update")
                            : messageService.getMessage("message.success.create"));
        } catch (Exception exception) {
            LOGGER.error(exception.getMessage(), exception);
            if(exception instanceof DuplicateUserEmailException)
                throw new DuplicateUserEmailException();
        }

        return responseBuilder.build().toString();
    }

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Наконец я решил это. Пожалуйста, найдите код ниже и прокомментируйте, если у вас есть сомнения.

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserApiController.class)
public class UserApiControllerTest {


    private MockMvc mockMvc;
    @Mock
    GenericService genericService;

    @Mock
    UserService userService;

    @Mock
    UserRoleService userRoleService;

    @Mock
    MessageService messageService;

    @Mock
    CurrentUserService currentUserService;

    @InjectMocks
    ApiExceptionHandlerAdvice apiExceptionHandlerAdvice;

    @Mock
    UserRepository userRepository;

    @Mock
    UserRoleRepository userRoleRepository;

    @InjectMocks
    UserApiController userApiController;


    @Before
    public void setup(){

      //  MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(userApiController).setControllerAdvice(apiExceptionHandlerAdvice).build();
    }

    @Test
    public void testAddDuplicateCustomer() throws Exception {

        HashMap mockUser = new HashMap<String,Object>();
        mockUser.put("email","test_dy1@gmail.com");
        String user = new ObjectMapper().writeValueAsString(mockUser);
        when(userService.saveUserByEmailId(any())).thenThrow(DuplicateUserEmailException.class);
        when(messageService.getMessage(any())).thenReturn("200");
        RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/user/api/save_user_by_email").param("user",user);
        MvcResult result = mockMvc.perform(requestBuilder).andReturn();
        MockHttpServletResponse response = result.getResponse();
        assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus());
        // assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus());
    }
0 голосов
/ 08 апреля 2020

Возможно, вы не передаете этот фиктивный экземпляр реальному экземпляру userApiController. Это действительно распространенная ошибка с фиктивными сервисами. Используете ли вы для этого @ InjectMocks или вы создаете экземпляр userApiController вручную? Не могли бы вы рассказать нам аннотации, которые вы используете выше тестового класса?

Если честно, я бы предложил использовать только Mockito, так как с PowerMock вы можете высмеивать множество сумасшедших вещей, и это делает манипулирование байтовым кодом

С Mockito это будет выглядеть так:

doThrow(newRuntimeException()).when(paymentService).completePayment(any(), any(), any());

И если вы хотите издеваться над сетевыми вызовами, пожалуйста, используйте WireMock, мы уже давно используем его, и он добавляет большую ценность нашему тестовому пакету.

0 голосов
/ 08 апреля 2020

Попробуйте так:

PowerMockito.doThrow(new DuplicateUserEmailException()).
                when(userService).saveUserByEmailId(any(String.class));

Убедитесь, что saveUserByEmailId метод void, тип возврата

...