[英]Unit testing while using Dagger 2 (Robolectric and Mockito)
I'm trying to write some tests for fragments which have fields annotated with @Inject. 我正在尝试为片段使用@Inject注释的字段编写一些测试。 For example, a chunk of my app looks like this:
例如,我的应用程序的一部分如下所示:
Module: 模块:
@Module
public class PdfFactoryModule {
@Provides @Singleton
PdfFactory providePdfFactory() {
return PdfFactory.getPdfFactory();
}
}
Component: 零件:
@Singleton
@Component(modules = PdfFactoryModule.class)
public interface CorePdfComponent {
void inject(PagerFragment pagerFragment);
}
Application: 应用:
public class CorePdfApplication extends Application {
@NonNull
private CorePdfComponent component;
@Override
public void onCreate() {
super.onCreate();
component = DaggerCorePdfComponent.builder().build();
}
@NonNull
public CorePdfComponent getComponent() {
return component;
}
}
PagerFragment: PagerFragment:
public class PagerFragment extends Fragment {
@Inject PdfFactory pdfFactory;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Dagger 2
((CorePdfApplication) getActivity().getApplication()).getComponent().inject(this);
}
(Note that these are only snippets of my whole code, I'm showing only the essentials for this particular dependency to keep it clear.) (请注意,这些只是我整个代码的片段,我仅在显示此特定依赖项的要点以使其清楚。)
I was trying to do a test like this: 我正在尝试做这样的测试:
Fake Module: 假模块:
@Module
public class FakePdfFactoryModule extends PdfFactoryModule {
@Override
PdfFactory providePdfFactory() {
return Mockito.mock(PdfFactory.class);
}
}
Fake Component: 假冒成分:
@Singleton
@Component(modules = FakePdfFactoryModule.class)
public interface FakeCorePdfComponent extends CorePdfComponent {
void inject(PagerFragmentTest pagerFragmentTest);
}
Fake Application: 假申请:
public class FakeCorePdfApplication extends CorePdfApplication {
@NonNull
private FakeCorePdfComponent component;
@Override
public void onCreate() {
super.onCreate();
component = DaggerFakeCorePdfComponent.builder().build();
}
@NonNull
public FakeCorePdfComponent getComponent() {
return component;
}
}
Test: 测试:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, application = FakeCorePdfApplication.class)
public class PagerFragmentTest {
PagerFragment pagerFragment;
@Before
public void setup() {
pagerFragment = new PagerFragment();
startVisibleFragment(pagerFragment);
}
@Test
public void exists() throws Exception {
assertNotNull(pagerFragment);
}
But the DaggerFakeCorePdfComponent doesn't generate. 但是不会生成DaggerFakeCorePdfComponent。 I may have messed up big time because I never tested with dependency injection.
我可能已经浪费了很多时间,因为我从未进行过依赖注入测试。 What am I doing wrong?
我究竟做错了什么?
My advice - "Do not use dagger in tests". 我的建议-“请勿在测试中使用匕首”。
Just change your code to next: 只需将代码更改为下一个即可:
public class FakeCorePdfApplication extends CorePdfApplication {
@NonNull
private CorePdfComponent component = mock(CorePdfComponent.class);
@Override
public void onCreate() {
super.onCreate();
}
@NonNull
public CorePdfComponent getComponent() {
return component;
}
}
And: 和:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, application = FakeCorePdfApplication.class)
public class PagerFragmentTest {
PagerFragment pagerFragment;
@Before
public void setup() {
pagerFragment = new PagerFragment();
CorePdfComponent component = ((CorePdfApplication)RuntimeEnvironment.application).getComponent();
doAnswer( new Answer() {
Object answer(InvocationOnMock invocation) {
fragment. pdfFactory = mock(PdfFactory.class);
return null;
}
}).when(component).inject(pageFragment);
startVisibleFragment(pagerFragment);
}
@Test
public void exists() throws Exception {
assertNotNull(pagerFragment);
}
}
You may try: 您可以尝试:
androidTestApt "com.google.dagger:dagger-compiler:<version>"
I was having similar problem, it worked for me. 我遇到类似的问题,它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.