使用 Dagger 2(Robolectric 和 Mockito)进行单元测试
Unit testing while using Dagger 2 (Robolectric and Mockito)
我正在尝试为具有用@Inject 注释的字段的片段编写一些测试。例如,我的应用程序的一部分如下所示:
模块:
@Module
public class PdfFactoryModule {
@Provides @Singleton
PdfFactory providePdfFactory() {
return PdfFactory.getPdfFactory();
}
}
组件:
@Singleton
@Component(modules = PdfFactoryModule.class)
public interface CorePdfComponent {
void inject(PagerFragment pagerFragment);
}
申请:
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:
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);
}
(请注意,这些只是我整个代码的片段,为了清楚起见,我只展示了这个特定依赖项的基本要素。)
我正在尝试做这样的测试:
假模块:
@Module
public class FakePdfFactoryModule extends PdfFactoryModule {
@Override
PdfFactory providePdfFactory() {
return Mockito.mock(PdfFactory.class);
}
}
假组件:
@Singleton
@Component(modules = FakePdfFactoryModule.class)
public interface FakeCorePdfComponent extends CorePdfComponent {
void inject(PagerFragmentTest pagerFragmentTest);
}
虚假申请:
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;
}
}
测试:
@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);
}
但是 DaggerFakeCorePdfComponent 没有生成。我可能把时间搞砸了,因为我从未测试过依赖注入。我做错了什么?
我的建议 - "Do not use dagger in tests".
只需将您的代码更改为下一个:
public class FakeCorePdfApplication extends CorePdfApplication {
@NonNull
private CorePdfComponent component = mock(CorePdfComponent.class);
@Override
public void onCreate() {
super.onCreate();
}
@NonNull
public CorePdfComponent getComponent() {
return component;
}
}
并且:
@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);
}
}
你可以试试:
androidTestApt "com.google.dagger:dagger-compiler:<version>"
我遇到了类似的问题,它对我有用。
我正在尝试为具有用@Inject 注释的字段的片段编写一些测试。例如,我的应用程序的一部分如下所示:
模块:
@Module
public class PdfFactoryModule {
@Provides @Singleton
PdfFactory providePdfFactory() {
return PdfFactory.getPdfFactory();
}
}
组件:
@Singleton
@Component(modules = PdfFactoryModule.class)
public interface CorePdfComponent {
void inject(PagerFragment pagerFragment);
}
申请:
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:
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);
}
(请注意,这些只是我整个代码的片段,为了清楚起见,我只展示了这个特定依赖项的基本要素。)
我正在尝试做这样的测试:
假模块:
@Module
public class FakePdfFactoryModule extends PdfFactoryModule {
@Override
PdfFactory providePdfFactory() {
return Mockito.mock(PdfFactory.class);
}
}
假组件:
@Singleton
@Component(modules = FakePdfFactoryModule.class)
public interface FakeCorePdfComponent extends CorePdfComponent {
void inject(PagerFragmentTest pagerFragmentTest);
}
虚假申请:
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;
}
}
测试:
@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);
}
但是 DaggerFakeCorePdfComponent 没有生成。我可能把时间搞砸了,因为我从未测试过依赖注入。我做错了什么?
我的建议 - "Do not use dagger in tests".
只需将您的代码更改为下一个:
public class FakeCorePdfApplication extends CorePdfApplication {
@NonNull
private CorePdfComponent component = mock(CorePdfComponent.class);
@Override
public void onCreate() {
super.onCreate();
}
@NonNull
public CorePdfComponent getComponent() {
return component;
}
}
并且:
@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);
}
}
你可以试试:
androidTestApt "com.google.dagger:dagger-compiler:<version>"
我遇到了类似的问题,它对我有用。