【问题标题】:Trying to Understand Java Dependency Injection with Example尝试通过示例理解 Java 依赖注入
【发布时间】:2016-10-20 16:21:38
【问题描述】:

我正在尝试创建一个数据库连接库,以便在我的所有应用程序中使用。我想确保这个库是完全单元测试的,所以我正在尝试使用依赖注入。

我有这个类,我想确保它经过测试:

public class ConnectionFactory {

    private String dataSourceName;

    public ConnectionFactory(String dataSourceName) {

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

        this.dataSourceName = dataSourceName;
    }

    public Connection getConnection() throws SQLException {

        Connection connection = getDataSource(dataSourceName).getConnection();

        if(connection != null) {
            return connection;
        }       

        ...
    }

    // Get a datasource object
    private DataSource getDataSource(String dataSourceName) {
        ...
        try {
            Context ctx = new InitialContext();
            dataSource = (DataSource) ctx.lookup("java:comp/env/" + dataSourceName);
        } catch (NamingException e) {
            ...
        }

        return dataSource;
    }

}

我希望能够通过以下简单的方式从我的所有应用程序中调用此类:

public class MyApp {
    public static void main(string[] args) {
        ConnectionFactory connectionFactory = new ConnectionFactory("jdbc/myDataSource");
        Connection connection = connectionFactory.getConnection();
    }
}

我已经开始为这个 ConnectionFactory 编写单元测试,但很快意识到我现在的代码无法模拟 DataSource 对象,所以它实际上是在尝试连接到一个真实的数据源。

@RunWith(Nested.class)
public class ConnectionFactoryTest {

    public class Constructor {

        @Test
        public void shouldThrowNullPointerIfParamIsNull() {
            assertThatExceptionOfType(NullPointerException.class)
                .isThrownBy(() -> { new ConnectionFactory(null); })
                .withMessage("dataSourceName can't be null");
        }
    }

    public class GetConnection {

        public class WithDataSourceAvailable {

            @Test
            public void shouldErrorIfParamIsNull() {
                ConnectionFactory connectionFactory = new ConnectionFactory("jdbc/myDataSource"); // <-- This is going to fail b/c it's trying to actually fetch a real data source
            }
        }   
    }
}

如何正确使用依赖注入,以便编写实际上不尝试连接到数据源的单元测试?

【问题讨论】:

  • “我无法模拟 DataSource 对象”这句话是错误的。可以使用 PowerMock 等工具模拟对象创建。
  • “我不能模拟”的意思是我不知道如何模拟它。

标签: java unit-testing junit dependency-injection


【解决方案1】:

看看Mockito,我发现它很容易用于这种类型的模拟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多