В другой настройке у нас есть несколько действий, определенных в отдельных модулях. Внедряемое действие находится в модуле библиотеки Android с собственным определением модуля RoboGuice в файле AndroidManifest.xml.
Настройка выглядит следующим образом. В библиотечном модуле есть следующие определения:
AndroidManifest.xml:
<application android:allowBackup="true">
<activity android:name="com.example.SomeActivity/>
<meta-data
android:name="roboguice.modules"
android:value="com.example.MainModule" />
</application>
Затем мы вводим тип:
interface Foo { }
Некоторые реализации Foo по умолчанию:
class FooThing implements Foo { }
MainModule настраивает реализацию FooThing для Foo:
public class MainModule extends AbstractModule {
@Override
protected void configure() {
bind(Foo.class).to(FooThing.class);
}
}
И, наконец, активность, которая потребляет Foo:
public class SomeActivity extends RoboActivity {
@Inject
private Foo foo;
}
В программном модуле Android-потребителя мы хотели бы использовать SomeActivity
, но для целей тестирования добавим наш собственный Foo
.
public class SomeOtherActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent(this, SomeActivity.class);
startActivity(intent);
}
}
Кто-то может поспорить, что нужно разобраться с обработкой модуля клиентским приложением, однако нам нужно в основном скрывать внедряемые компоненты, поскольку библиотечный модуль является SDK, и экспонирование фрагментов имеет более серьезные последствия.
(Помните, что это для тестирования, поэтому мы знаем внутреннюю часть SomeActivity и знаем, что она потребляет (видимый пакет) Foo).
Способ, который я нашел, работает, имеет смысл; используйте предложенное переопределение для тестирования :
public class SomeOtherActivity extends Activity {
private class OverrideModule
extends AbstractModule {
@Override
protected void configure() {
bind(Foo.class).to(OtherFooThing.class);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RoboGuice.overrideApplicationInjector(
getApplication(),
RoboGuice.newDefaultRoboModule(getApplication()),
Modules
.override(new MainModule())
.with(new OverrideModule()));
}
@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent(this, SomeActivity.class);
startActivity(intent);
}
}
Теперь, когда SomeActivity
запущен, он получит OtherFooThing
для своего внедренного Foo
экземпляра.
Это очень специфическая ситуация, когда в нашем случае OtherFooThing использовался внутренне для записи тестовых ситуаций, тогда как FooThing использовался, по умолчанию, для всех других применений.
Имейте в виду, мы используем #newDefaultRoboModule
в наших модульных тестах, и это работает безупречно.