首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试需要授权的屏幕?浓缩咖啡+ MockWebServer

如何测试需要授权的屏幕?浓缩咖啡+ MockWebServer
EN

Stack Overflow用户
提问于 2019-08-14 16:55:53
回答 1查看 69关注 0票数 1

我正在创建UI测试。为了不与真正的服务器交互,我使用MockWebServer。我的目标是模拟各种服务器响应,并查看整个程序将如何响应它们。目前,我不知道如何打开需要授权的屏幕。当然,我可以编写一个代码,它将登录到授权屏幕,然后转到所需的窗口。但这需要额外的时间来完成测试,我想避免这种情况。我不想模拟类,因为我需要检查应用程序的生产版本。我该怎么做?

对于DI,我使用Dagger-2。以下是组件代码:

代码语言:javascript
复制
@Singleton
@Component(modules = {
        AvatarsModule.class,
        EncryptionModule.class,
        ApiModule.class,
        WalletsModule.class,
        GeneralModule.class,
        InteractorsModule.class,
        PushNotificationsModule.class,
        AppModule.class
})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder context(Context context);
        AppComponent build();
    }

    void inject(App app);
}

下面是存储授权状态的类代码:

代码语言:javascript
复制
public class ApiWrapper {
    private Api api;
    private KeyPair keyPair;
    private Account account; 

    ...

    public Flowable<Authorization> authorize(KeyPair tempKeyPair) {
        return api
                .authorize(tempKeyPair.getPublicKeyString().toLowerCase())
                .subscribeOn(Schedulers.io())
                .doOnNext((authorization -> {
                    this.account = authorization.getAccount();
                    this.keyPair = tempKeyPair;
                }));
    }
    ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-18 17:15:27

如果有人还感兴趣的话。我编写了一个InstrumentationTestFacade类,在其中我使用Dagger放置了一个ApiWrapper对象。接下来,将InstrumentationTestFacade注入应用程序对象。由于应用程序对象不是单例,主代码中没有泄漏责任,但是从测试代码中可以使用以下代码访问这个外观:

代码语言:javascript
复制
Application application = (Application) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext();
InstrumentationTestFacade facade = application.getInstrumentationTestFacade();

以下是一个例子:

代码语言:javascript
复制
public class InstrumentationTestFacade {
    private LogoutInteractor logoutInteractor;
    private SecurityInteractor securityInteractor;
    private ApiWrapper apiWrapper;

    public InstrumentationTestFacade(
            LogoutInteractor logoutInteractor,
            SecurityInteractor securityInteractor,
            ApiWrapper apiWrapper
    ) {
        this.logoutInteractor = logoutInteractor;
        this.securityInteractor = securityInteractor;
        this.apiWrapper = apiWrapper;
    }

    public void logout() {
        logoutInteractor.logout();
    }

    public ApiWrapper getApiWrapper() {
        return apiWrapper;
    }

    public SecurityInteractor getSecurityInteractor() {
        return this.securityInteractor;
    }
}
代码语言:javascript
复制
public class Application extends MultiDexApplication implements HasActivityInjector, HasServiceInjector {

    ...

    @Inject
    InstrumentationTestFacade instrumentationTestFacade;


    @Override
    public void onCreate() {
        super.onCreate();

        DaggerAppComponent
                .builder()
                .context(this)
                .build()
                .inject(this);

    }

    ...

    public InstrumentationTestFacade getInstrumentationTestFacade() {
        return instrumentationTestFacade;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57499016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档