我有一個Presenter
類使用通過注射匕首一個字段,它看起來是這樣的:單位懲戒注入實地測試
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
?
Ofcourse我可以添加一個新的方法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);
}
}
一次:當你沒有單元測試,但你怎麼知道它工作正常?第二:這個字段既不是'private'也不是'final',所以你可以簡單地從你的TestClass中設置它(如果它在同一個包中)。 –
1 - 您運行該應用程序,並且當該字段未被注入時,您會立即看到結果:),2 - 我認爲我將按照以下建議與施工注射一起去,但也要感謝您的建議。 –
*「,當字段沒有被注入時,你會立即看到結果:)」* OK,但是這是「DI框架工程」,這不是我對「一切正常」的理解,其中包括* my的實際行爲*代碼,而不是任何框架的代碼。這就是爲什麼我問......; o) –