【问题标题】:Android - Roboguice and Robolectric injecting activity members?Android - Roboguice 和 Robolectric 注入活动成员?
【发布时间】:2013-11-20 18:27:34
【问题描述】:

我正在使用 Robolectric 运行 JUnit 测试。我正在尝试测试一个注入成员的活动。我能够让我的测试类正确地注入它自己的成员。但仍然无法将模拟注入到我的 Activity 成员中。

我试过了

@Inject LoginActivity loginActivity;

也试过了

LoginActivity activity = new LoginActivity();
injector.injectMembers(activity);

我的测试

@RunWith(RobolectricTestRunner.class)

public class LoginActivityTest  {

    protected Injector injector;

        // This get injected correctly
        @Inject
        protected IServiceClient serviceClient;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, new MobileTestModule());
        injector = RoboGuice.getBaseApplicationInjector(Robolectric.application);
        injector.injectMembers(this);


        LoginActivity activity = new LoginActivity();
            // This fails
        injector.injectMembers(activity);
    }

    @After
    public void tearDown() {

    }

我的 DI 模块

public class MobileTestModule extends AbstractModule {

    @Override
    protected void configure() {

        // Services
        bind(IServiceClient.class).toInstance(Mockito.mock(IServiceClient.class));
        // Other binding here
    }
}

编辑

这是我得到的例外

com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for android.content.Context was bound.
  while locating android.content.Context
    for parameter 0 at com.company.app.helpers.SlideMenuAdapter.<init>(Unknown Source)
  while locating com.company.app.helpers.SlideMenuAdapter
    for field atcompanycom.company.atlasmobile.helpers.AtlasPhoneActivity.slideMenuAdapter(Unknown Source)
  while locating com.company.app.pages.login.LoginActivity
    for field at com.company.app.test.LoginActivityTest.loginActivity(Unknown Source)
  while locating com.company.app.test.LoginActivityTest

2) No scope is bound to roboguice.inject.ContextSingleton.
  at roboguice.inject.ContentViewListener.class(Unknown Source)
  while locating roboguice.inject.ContentViewListener
    for field at roboguice.activity.RoboActivity.ignored(Unknown Source)
  while locating com.nuvasive.atlasmobile.pages.login.LoginActivity
    for field at com.nuvasive.atlasmobile.test.LoginActivityTest.loginActivity(Unknown Source)
  while locating com.company.app.test.LoginActivityTest

【问题讨论】:

  • 你能发布你看到的错误吗?
  • @Macro 用例外更新了我的答案
  • 看起来你也注入了一个上下文。也许您需要为您的模块添加上下文绑定?
  • 是的,但还没有找到如何绑定上下文。一整天都在找这个。尝试将 Context 绑定到模拟上下文没有运气
  • 好的修复了上下文,现在它抱怨布局充气器。所以基本上看起来 Robolectric 没有做它使用影子类的工作

标签: android robolectric roboguice


【解决方案1】:

以下是您如何使用 Robolectric 设置 RoboGuice,并对测试类成员强制注入。

// Setup Module
RoboGuice.setBaseApplicationInjector(Robolectric.application, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(Robolectric.application)).with(new MyModule()));

// Get an Injector instance
injector = RoboGuice.getInjector(Robolectric.application);

// Inject properties on test class members (Marked with @Inject)
injector.injectMembers(this);

以下是使用 Robolectric 时如何初始化活动

LoginActivity activity = Robolectric.buildActivity(LoginActivity.class).create().get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多