Sta*_*nd0 7 android mockito android-espresso dagger-2
我有一个严重依赖注入(dagger2)应用程序.我想在没有测试导航整个应用程序的情况下运行espresso测试,并登录到应用程序.
我想从我的teleActivity开始,并模拟登录管理器.但是在任何@test函数中,我们已经调用了空指针,因为我们调用了onCreate.如果我在启动活动之前覆盖它(如下所示),则活动为空.
根据我的理解,切换下划线依赖关系的能力是我们使用Dagger2的一个重要原因,否则它只是一个非常过度设计的单例.如何覆盖,模拟或切换注射到测试匕首模块 - 所以我可以创建这个简单的浓咖啡测试.
注意我还在MVP设计模式中写了所有这些,如果这有所不同.
TeleActivity
@Inject
TelePresenter mTelePresenter;
@Inject
public LoginStateManager mLoginStateManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
DaggerInjectorTele.get().inject(this);
mTelePresenter.setTeleDependencies(this);
Intent intent = getIntent();
String searchId = null;
if (intent != null) {
searchId = intent.getStringExtra(Constants.SEARCH_ID);
}
mTelePresenter.onCreateEvent(searchId,
Helper.makeAuthorizationHeader(
// CRASH Null pointer
mLoginStateManager.getBaseLoginResponse().getAccessToken()));
}
Run Code Online (Sandbox Code Playgroud)
浓咖啡
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TeleTest {
@Rule
public ActivityTestRule<TeleActivity> mActivityTestRule = new ActivityTestRule(
TeleActivity.class) {
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
TeleActivity teleActivity = (TeleActivity)getActivity();
//teleActivity NULL!
teleActivity.mLoginStateManager = mock(LoginStateManager.class);
LoginResponse loginResponse = mock(LoginResponse.class);
when(loginResponse.getAccessToken()).thenReturn("1234");
// Nope here still null
when(teleActivity.mLoginStateManager.getBaseLoginResponse()).thenReturn(loginResponse);
}
};
Run Code Online (Sandbox Code Playgroud)
匕首注射器
public class DaggerInjectorTele {
private static TelePresenterComponent telePresenterComponent =
DaggerTelePresenterComponent.builder().build();
public static TelePresenterComponent get() {
return telePresenterComponent;
}
}
Run Code Online (Sandbox Code Playgroud)
TelePresenterComponent
@Singleton
@Component(modules = {TelePresenterModule.class,
LoginStateManagerModule.class})
public interface TelePresenterComponent {
void inject(TeleActivity activity);
}
Run Code Online (Sandbox Code Playgroud)
TelePresenterModule
@Module
public class TelePresenterModule {
@Provides
@Singleton
public TelePresenter getTelePresenter() {
return new TelePresenter();
}
}
Run Code Online (Sandbox Code Playgroud)
LoginStateManagerModule
@Module
public class LoginStateManagerModule {
@Provides
@Singleton
public LoginStateManager getLoginStateManager(){
return new LoginStateManager();
}
}
Run Code Online (Sandbox Code Playgroud)
首先,您决定使用依赖注入(Dagger2)是一个非常好的决定,确实会使您的测试更容易编写.
您必须覆盖依赖注入配置(模块)并注入模拟.这是一个如何完成它的简单例子.
首先你需要一个模拟:
LoginStateManager lsmMock = mock(LoginStateManager.class);
Run Code Online (Sandbox Code Playgroud)
现在覆盖DI配置以使用此模拟:
//Extend your TelePresenterModule, override provider method
public class TestTelePresenterModule extends TelePresenterModule{
@Override
public LoginStateManager getLoginStateManager() {
//simply return the mock here
return lsmMock;
}
}
Run Code Online (Sandbox Code Playgroud)
现在来测试一下:
@Test
//this is an espresso test
public void withAMock() {
//build a new Dagger2 component using the test override
TelePresenterComponent componentWithOverride = DaggerTelePresenterComponent.builder()
//mind the Test in the class name, see a class above
.telePresenterModule(new TestTelePresenterModule())
.build();
//now we initialize the dependency injector with this new config
DaggerInjectorTele.set(componentWithOverride);
mActivityRule.launchActivity(null);
//verify that injected mock was interacted with
verify(lsmMock).whatever();
}
Run Code Online (Sandbox Code Playgroud)
示例来自:https://github.com/yuriykulikov/DIComparison/blob/master/app/src/androidTest/java/com/example/yuriy/dependencyinjectioncomparison/Dagger2Test.java
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |