Получение Mockito Exception: проверенное исключение недействительно для этого метода

У меня есть метод, который я пытаюсь проверить

public List<User> getUsers(String state) {

        LOG.debug("Executing getUsers");

        LOG.info("Fetching users from " + state);
        List<User> users = null;
        try {
            users = userRepo.findByState(state);
            LOG.info("Fetched: " + mapper.writeValueAsString(users));
        }catch (Exception e) {
            LOG.info("Exception occurred while trying to fetch users");
            LOG.debug(e.toString());
            throw new GenericException("FETCH_REQUEST_ERR_002", e.getMessage(), "Error processing fetch request");
        }
        return users;
    }

Ниже мой тестовый код:

@InjectMocks
    private DataFetchService dataFetchService;

    @Mock
    private UserRepository userRepository;

@Test
    public void getUsersTest_exception() {
        when(userRepository.findByState("Karnataka")).thenThrow(new Exception("Exception"));
        try {
            dataFetchService.getUsers("Karnataka");
        }catch (Exception e) {
            assertEquals("Exception", e.getMessage());
    }
    }

Ниже мой интерфейс UserRepository:

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {

public List<User> findByState(String state);
}

Когда я запускаю мой тест как тест Junit, он дает мне следующую ошибку:

org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: java.lang.Exception: Exception occurred

Любая идея о том, как решить эту проблему? Заранее спасибо.


person sk17261205    schedule 27.09.2019    source источник
comment
Сообщение об ошибке очень специфично: ваш метод findByState не может генерировать Exception. В частности, обратите внимание на то, что (1) вы должны перехватывать наиболее конкретное возможное исключение, в данном случае DataAccessException, и (2) для устранения неполадок вредно маскировать основное исключение; обязательно используйте цепочный конструктор, который принимает Throwable cause.   -  person chrylis -cautiouslyoptimistic-    schedule 27.09.2019


Ответы (2)


Вы должны использовать RuntimeException или его подкласс. Ваш метод должен объявить проверенное исключение (пример: findByState(String state) throws IOException;), в противном случае используйте RuntimeException:

 when(userRepository.findByState("Karnataka"))
       .thenThrow(new RuntimeException("Exception"));
person i.bondarenko    schedule 27.09.2019

Согласно приведенному примеру, в идеале следует искать GenericException

when(userRepository.findByState("Karnataka")).thenThrow(RuntimeException.class);

GenericException exception = assertThrows(GenericException.class, () -> 
                                       userRepository.findByState("Karnataka"));
person Gayan Weerakutti    schedule 03.11.2020