繁体   English   中英

Mockito Checked异常对此方法无效

[英]Mockito Checked exception is invalid for this method

尝试使用此模拟程序时,出现错误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");
}

我要测试的课程:

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);
        }
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM