android - 我是否正确地在 Activity 代码中进行依赖注入(inject)?

标签 android android-fragments testing android-activity dependency-injection

我目前正在编写我的第一个 android 项目,我想根据依赖注入(inject)模式对其进行重构。从我的应用程序中最简单的 Activity 开始 - 初始屏幕 - 我问自己,我是否正确理解了模式的概念。

到目前为止,这是我的 SplashActivity 的代码:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        Fragment fragmentToDisplay = null;
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            fragmentToDisplay = new LoginFragment();
        } else {
            if (savedInstanceState == null) {
                fragmentToDisplay = new SplashFragment();
            }
        }
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
    }
}

根据 IntentExtra "isLaunch" 的内容,我想显示不同的 fragment 。现在,我读到每一个 new ServiceXY() 都会使代码的可测试性降低,这实际上不是依赖注入(inject)的目标。所以我重构了我的代码:

public class SplashActivity extends AppCompatActivity {

    private SplashFragment splashFragment;
    private LoginFragment loginFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        splashFragment = new SplashFragment();
        loginFragment = new LoginFragment();

        Fragment fragmentToDisplay = null;
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            fragmentToDisplay = loginFragment;
        } else {
            if (savedInstanceState == null) {
                fragmentToDisplay = splashFragment;
            }
        }
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
    }
}

然而,这似乎并没有太大的不同。如果我想测试,如果显示正确的 fragment ,这如何提高我的代码的可测试性?感谢转发。

最佳答案

您是对的,您的更改不会产生太大影响,也不会注入(inject)依赖项。由于您的 SplashActivity 对象负责创建 fragment ,因此它们仍然依赖于 SplashActivity 对象。

如果你想使用依赖注入(inject),你必须在 SplashActivity 之外的某个地方创建 fragment 对象,然后将它们传递到对象中。

根据依赖注入(inject)原则,您的服务将是 fragment 类型,使用该服务的客户端将是 SplashActivity,因此您需要另一个对象将正确的服务“注入(inject)”到客户端。 https://stackify.com/dependency-injection/

您可以使用第一个 fragment 中的代码,而不是检查 oncreate 中的 bool 值来设置正确的 fragment 类型,您可以简单地将 fragment 对象传递到 splashactivity 类中,然后转到 fragmentToDisplay = fragmentPassedIntoClass。然后您可以测试传递到类中的 fragment 是否是正确的类型,以及事务是否正确开始。注入(inject)器将负责传递正确的 fragmentPassedIntoClass

MainFragment fragment;
if(splash){ fragment = new SplashFragment(); }
if(login){fragment = new LoginFragment(); }

// Pass fragment variable into splash activity
SplashActivity activty = new SplashActivity(fragment);

public class SplashActivity{
    MainFragment mFragment;

    public SplashActivty(MainFragment fragment){
        mFragment = fragment;
    }
}

关于android - 我是否正确地在 Activity 代码中进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710826/

相关文章:

android - 仅等待输入 X 时间

android - SurfaceFlinger : Failed to find layer FullScreenFragmentActivity in layer parent (no-parent)

android - ViewPager 中的 fragment 有时会被垃圾收集吗? AsyncTask/ListView/ViewPager 问题

wcf - 单元测试 LinqToSqlDomainService

ruby-on-rails - 使用 Rspec 测试和模拟服务

testing - 如何测试与其他模块服务关联的 Controller ?嵌套

java - 是否有包含图标和文本的内部布局?

android - 如何实用地为每个 GridView 项目设置不同的颜色/背景/高度/宽度等?

android - 使用触摸事件在 Android 中进行反向地理编码

android - 如何使用 Firebase 性能跟踪 Fragments 的帧指标?