我是否在活动代码中正确进行依赖项注入?

时间:2018-12-10 17:37:54

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

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

这是到目前为止我的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"的内容,我想显示一个不同的片段。现在,我了解到每个new ServiceXY()都使代码的可测试性降低,实际上这并不是依赖注入的目标。因此,我将代码重构为:

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();
    }
}

但是,这似乎并没有太大的区别。如果要测试,是否显示正确的片段,这将如何提高代码的可测试性?谢谢。

1 个答案:

答案 0 :(得分:1)

您是对的,您所做的更改没有多大变化,也没有注入依赖性。由于您的SplashActivity对象负责创建片段,因此它们仍然依赖于SplashActivity对象。

如果要使用依赖注入,则必须在SplashActivity之外的某个位置创建片段对象,然后将其传递到对象中。

按照依赖项注入的原则,您的服务将是片段类型,使用该服务的客户端将是SplashActivity,因此您需要另一个将“正确”服务注入客户端的对象。 https://stackify.com/dependency-injection/

您可以使用第一个代码段中的代码,但无需检查oncreate中的布尔值以设置正确的片段类型,只需将片段对象传递到splashactivity类中并转到fragmentToDisplay = fragmentPassedIntoClass。然后,您可以测试传递到类中的片段是否为正确的类型,以及事务是否正确开始。喷射器将负责通过正确的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;
    }
}