【发布时间】: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