java Mockito Checked 异常对此方法无效

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40197328/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 04:59:48  来源:igfitidea点击:

Mockito Checked exception is invalid for this method

javaunit-testingmockito

提问by Catfish

I'm getting the error Checked exception is invalid for this methodwhen trying to use this mock:

Checked exception is invalid for this method尝试使用此模拟时出现错误:

InitialContext mockContext;
mockContext = mock(InitialContext.class);
when((DataSource) mockContext.lookup("java:comp/env/jdbc/foo")).thenThrow(new ConnectionFactoryException("test")); // <-- Fails on this line

@Test
public void shouldThrowExceptionIfDataSourceDoesNotExist() throws ConnectionFactoryException {
    assertThatExceptionOfType(ConnectionFactoryException.class)
        .isThrownBy(() -> { new DataSourceFactory(mockContext).getDataSource("foo"); })
        .withMessage("Unable to find jdbc/foo");
}

Class I'm trying to test:

我正在尝试测试的类:

public class DataSourceFactory {

    // Dependencies to be injected
    private InitialContext context;

    public DataSourceFactory(InitialContext context) throws ConnectionFactoryException {

        if(context == null) {
            throw new ConnectionFactoryException("context can't be null");
        }

        this.context = context;
    }

    public DataSource getDataSource(String dataSourceName) throws ConnectionFactoryException {

        if(dataSourceName == null) {
            throw new ConnectionFactoryException("dataSourceName can't be null");
        }

        // Ensure we have the correct syntax for the datasource name
        if(!dataSourceName.startsWith("jdbc/")) {
            dataSourceName = "jdbc/" + dataSourceName;
        }

        try {
            System.out.println("java:comp/env/" + dataSourceName);
            DataSource dataSource = (DataSource) context.lookup("java:comp/env/" + dataSourceName);
            return dataSource;
        } catch (NamingException e) {
            throw new ConnectionFactoryException("Unable to find " + dataSourceName, e);
        }
    }
}

I know I've read that I shouldn't mock objects I don't own, but I can't figure out how to test the getDataSource()method without mocking InitialContext.

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

回答by Mureinik

lookupindeed doesn't throw a ConnectionFactoryException- your code does. Instead, you should throw the correct exception - a NamingException, and test that your code handles it as expected (i.e., throws up a ConnectionFactoryException`):

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

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