我目前已经布置了以下类/接口。类型T
表示从DataProvider
实现返回的数据格式。我正在使用工厂,所以我不需要将类型信息附加到MyStreamingOutput
. 我HK2
用来注入DataProviderFactory
到MyStreamingOutput
.
public interface DataProvider<T> {
public T next() { ... }
...
}
public final class SQLDataProvider<T> {
public SQLDataProvider(final String query, final RowMapper<T> rowMapper) { ... }
}
public interface DataProviderFactory {
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper);
...
}
public final class SQLDataProviderFactory {
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper) {
return new SQLDataProvider<T>(query, rowMapper);
}
}
public final class MyStreamingOutput implements StreamingOutput {
public MyStreamingOutput(final DataProviderFactory dpFactory) { ... }
@Override public void write(final OutputStream outputStream) throws IOException { ... }
}
这一切都很好。现在我正在尝试为 设置一个单元测试MyStreamingOutput
,但我遇到了几个障碍。我为测试目的编写了以下附加类:
public final class DataProviderFactoryStub implements DataProviderFactory {
private final DataProvider dataProvider;
public DataProviderFactoryStub() {
this.dataProvider = new DataProviderStub();
}
public DataProviderFactoryStub(final DataProvider dataProvider) {
this.dataProvider = dataProvider;
}
@Override
public <T> DataProvider<T> getDataProvider(final String query, final RowMapper<T> rowMapper) {
return this.dataProvider;
}
}
绑定发生在
final class QueryTestResourceConfig extends ResourceConfig {
public QueryTestResourceConfig() {
...
this.register(new AbstractBinder() {
@Override
protected void configure() {
bind(DataProviderFactoryStub.class).to(DataProviderFactory.class);
}
});
}
}
我可以成功地将这个类注入到MyStreamingOutput
中,但是它有一个编译器警告,因为getDataProvider()
传递给工厂的实例不共享 所使用的类型信息。我无法向DataProviderFactoryStub
类添加类型信息,因为它不再实现DataProviderFactory
接口。我不想要接口上的类型信息,因为它是错误的——在 Stub 案例之外,工厂不应该关心DataProvider
实例返回的类型。我非常想避免对query
androwMapper
参数使用设置器,因为在这种情况下我认为这是不好的设计。
我无法摆脱这样一种感觉,即我在泛型应用程序中遗漏了一些微妙的东西,或者在我的依赖注入应用程序中遗漏了一些明显的东西。解决此用例的正确方法是什么?这似乎是 DI 旨在解决的问题,但我不知道如何解决它。