我目前正在编写我的第一个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();
}
}
但是,这似乎并没有太大的区别。如果要测试,是否显示正确的片段,这将如何提高代码的可测试性?谢谢。
答案 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;
}
}