获取 Mockito 异常:已检查异常对此方法无效
Getting Mockito Exception : checked exception is invalid for this method
我有一个正在尝试测试的方法
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
知道如何解决这个问题吗?提前致谢。
您应该使用 RuntimeException
或将其子类化。您的方法必须声明检查异常(例如:findByState(String state) throws IOException;
)否则使用 RuntimeException
:
when(userRepository.findByState("Karnataka"))
.thenThrow(new RuntimeException("Exception"));
根据提供的示例,理想情况下应该寻找 GenericException
when(userRepository.findByState("Karnataka")).thenThrow(RuntimeException.class);
GenericException exception = assertThrows(GenericException.class, () ->
userRepository.findByState("Karnataka"));
如果您可以修改源代码,则使用 RuntimeException 或将 RuntimeException.class 扩展为@i.bondarekno 和@Gayan 提到的
在某些情况下,我们无法更改源代码,此时您可以使用 mockito do answer 来抛出检查异常。
doAnswer((invocation) -> {
throw new IOException("invalid");
}).when(someClass).someMethodName();
我有一个正在尝试测试的方法
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
知道如何解决这个问题吗?提前致谢。
您应该使用 RuntimeException
或将其子类化。您的方法必须声明检查异常(例如:findByState(String state) throws IOException;
)否则使用 RuntimeException
:
when(userRepository.findByState("Karnataka"))
.thenThrow(new RuntimeException("Exception"));
根据提供的示例,理想情况下应该寻找 GenericException
when(userRepository.findByState("Karnataka")).thenThrow(RuntimeException.class);
GenericException exception = assertThrows(GenericException.class, () ->
userRepository.findByState("Karnataka"));
如果您可以修改源代码,则使用 RuntimeException 或将 RuntimeException.class 扩展为@i.bondarekno 和@Gayan 提到的
在某些情况下,我们无法更改源代码,此时您可以使用 mockito do answer 来抛出检查异常。
doAnswer((invocation) -> {
throw new IOException("invalid");
}).when(someClass).someMethodName();