gpt4 book ai didi

java - 在单元测试中模拟注入(inject)字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:34 26 4
gpt4 key购买 nike

我有一个 Presenter 类,它使用通过 Dagger 注入(inject)的字段,它看起来像这样:

public class RssListPresenter {

@Inject
RssService rssService; // <-- injected field

public RssListPresenter() {
setupDI();
}

private void setupDI() {
DaggerNetworkComponent.builder()
.networkModule(new NetworkModule())
.build()
.inject(this);
}

public void loadItems() {
Rss rss = rssService.getRssFeed()
// ....
}
}

一切正常。现在,我想对 RssListPresenter 类进行单元测试。问题是如何向演示者提供模拟 RssService

当然我可以向演示者添加一个新方法 setRssService(RssService rssService) 并使用它来提供来自单元测试的模拟,但是仅仅为单元测试添加这个方法感觉不对。处理此问题的正确方法是什么?

为了完整起见,这里是模块和组件声明:

@Singleton
@Component(modules = NetworkModule.class)
public interface NetworkComponent {
void inject(RssListPresenter presenter);
}

@Module
public class NetworkModule {

@Provides
Retrofit provideRetrofit() {
// ...
}

@Provides
@Singleton
RssService providePcWorldRssService(Retrofit retrofit) {
return retrofit.create(RssService.class);
}

}

最佳答案

属性注入(inject)就是这样,不是那么容易测试的。在这种情况下,构造函数注入(inject)要好得多。将您的构造函数重构为如下所示:

private final RssService rssService;

@Inject
public RssListPresenter(RssService rssService) {
this.rssService = rssService;
}

现在您可以轻松地对其进行测试:

//mocks
RssService mockRssService;

//system under test
RssListPresenter rssListPresenter;

@Before
public void setup() {
mockRssService = Mockito.mock(RssService.class);
rssListPresenter = new RssListPresenter(mockRssService);
}

您可能不应该在 RssListPresenter 中使用 DaggerNetworkComponent.inject(this)。相反,您应该配置 Dagger ,以便当它向您的顶级类(ActivityFragmentService)注入(inject)成员时,它可以访问对象图并创建 RssPresenter 的实例。

为什么只将注入(inject)器放在 ActivityService 中而不是像 RssListPresenter 这样的东西?这些是由 Android 系统实例化的类,因此您别无选择,只能使用注入(inject)器。

澄清一下,ActivityFragment 等是理想的注入(inject)目标RssListPresenter 等是注入(inject)的依赖项。您需要配置依赖项注入(inject)框架,dagger,以便它可以提供正确的依赖项以注入(inject)到注入(inject)目标中。

所以你还需要为RssListPresenter编写一个@Provides方法

@Provides provideRssListPresenter(RssService rssService) {
return new RssListPresenteR(rssService);
}

关于java - 在单元测试中模拟注入(inject)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40442859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com