此方法的Mockito检查异常无效

lsmepo6l  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(235)

当我尝试使用这个mock时,我得到了错误Checked exception is invalid for this method

  1. InitialContext mockContext;
  2. mockContext = mock(InitialContext.class);
  3. when((DataSource) mockContext.lookup("java:comp/env/jdbc/foo")).thenThrow(new ConnectionFactoryException("test")); // <-- Fails on this line
  4. @Test
  5. public void shouldThrowExceptionIfDataSourceDoesNotExist() throws ConnectionFactoryException {
  6. assertThatExceptionOfType(ConnectionFactoryException.class)
  7. .isThrownBy(() -> { new DataSourceFactory(mockContext).getDataSource("foo"); })
  8. .withMessage("Unable to find jdbc/foo");
  9. }

我试着考类:

  1. public class DataSourceFactory {
  2. // Dependencies to be injected
  3. private InitialContext context;
  4. public DataSourceFactory(InitialContext context) throws ConnectionFactoryException {
  5. if(context == null) {
  6. throw new ConnectionFactoryException("context can't be null");
  7. }
  8. this.context = context;
  9. }
  10. public DataSource getDataSource(String dataSourceName) throws ConnectionFactoryException {
  11. if(dataSourceName == null) {
  12. throw new ConnectionFactoryException("dataSourceName can't be null");
  13. }
  14. // Ensure we have the correct syntax for the datasource name
  15. if(!dataSourceName.startsWith("jdbc/")) {
  16. dataSourceName = "jdbc/" + dataSourceName;
  17. }
  18. try {
  19. System.out.println("java:comp/env/" + dataSourceName);
  20. DataSource dataSource = (DataSource) context.lookup("java:comp/env/" + dataSourceName);
  21. return dataSource;
  22. } catch (NamingException e) {
  23. throw new ConnectionFactoryException("Unable to find " + dataSourceName, e);
  24. }
  25. }
  26. }

我知道我已经读到不应该模拟我不拥有的对象,但是我不知道如何在不模拟InitialContext的情况下测试getDataSource()方法。

3pmvbmvn

3pmvbmvn1#

lookup实际上不会抛出ConnectionFactoryException a-你的代码会抛出。相反,你应该抛出正确的异常--一个NamingException,并测试你的代码是否按预期处理它(即抛出一个ConnectionFactoryException):

  1. when(mockContext.lookup("java:comp/env/jdbc/foo"))
  2. .thenThrow(new NamingException("test"));

相关问题