当前位置: 首页 > 知识库问答 >
问题:

用Dagger测试期间用Mockito模拟替换提供者注射

祁博雅
2023-03-14

我正在尝试试驾我正在对我的Android服务进行的一系列更改(Android.app.service)-我正在使用Dagger和Robolectric,我需要用一些模拟来替换服务中的字段注入类,以缩小测试范围…使它(稍微)更像“单元”。

我在我的android.app.Service中插入提供者(Guice语法…)。在单元测试期间,如何用MockProviders替换它们?

这就是相关服务代码的样子;

@Inject SpotService spotService;
@Inject Provider<SynchroniseTidePosition> syncTidePosition;
@Inject Provider<SynchroniseSwellDataTask> syncBuoyData;
@Inject Provider<SynchroniseConditionsTask> syncConditionsData;
@Inject SpotRatingCalculator spotRatingCalculator;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject NotificationManager notificationManager;

/**
 * @see android.app.Service#onCreate()
 */
@Override
public void onCreate() {
  super.onCreate();
  inject(this);
...

因此,在正常操作下,startService(intent)调用允许服务在onCreate期间注入其依赖项,我们都很好。

在我的测试下,我想用Mockito模拟替换注入的Providersget()调用。我试图遵循Dagger测试示例,并创建了一个类似于此的测试模块;

@Module(includes = OceanLifeModule.class,
        injects = {TestSynchronisationServiceNotifications.class},
        overrides = true)
  static class TestSynchronisationServiceNotificationsModule {
    @Provides LocalBroadcastManager provideLocalBroadcastManager() {
      return LocalBroadcastManager.getInstance(Robolectric.application);
    }
    
    @Provides NotificationManager providesNotificationManager() {
      return (NotificationManager) Robolectric.application.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    
    @Provides SpotService provideSpotService() {
      return mock(SpotService.class);
    }
    
    @Provides SpotRatingCalculator provideSpotRatingCalculator() {
      return mock(SpotRatingCalculator.class);
    }
    
    @Provides SynchroniseTidePosition provideSyncTidePosition() {
      return mock(SynchroniseTidePosition.class);
    }
    
    @Provides SynchroniseConditionsTask provideSyncConditionsTask() {
      return mock(SynchroniseConditionsTask.class);
    }
    
    @Provides SynchroniseSwellDataTask provideSyncSwellDataTask() {
      return mock(SynchroniseSwellDataTask.class);
    }
  }

我期望当我的实际服务代码调用提供程序get()时,我会得到Mockito模拟(这些是我的测试模块@提供的模拟)。

这不会发生。我来这里的方法怎么了?


共有1个答案

郭坚壁
2023-03-14

制作自己的Providers.of()

public static <T> Provider<T> of(final T t) {
  return new Provider<T>() {
    public T get() {
      return t;
     }
  }
}

Dagger应该在测试模块中包含这一点。

 类似资料:
  • 我有一个使用Spring依赖注入的Java应用程序。我想模拟一个bean,并验证它是否接收某些方法调用。 问题是Mockito不会在测试之间重置mock,因此我无法正确验证对它的方法调用。 我的测试单元: 单元测试类: 最后, 虽然我可以通过在测试之间手动重置模拟来解决这个问题,但我想知道是否有更干净/更习惯的方法。

  • 我正在用Kotlin和Dagger 2开发一个Android项目。我有一个,我在其中定义了一些提供程序函数。 我看到有些人使用kotlin,有些人使用Dagger的来注释提供者函数: > 注释和/或的动机是什么?背后的原因是什么,或者这样做的好处是什么? 使用和哪个更好?或者哪一个都没问题?或者我应该两个都用,如果是,那么两个都用的原因是什么?

  • 嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是

  • 我正在使用SpringRunner运行JUnit mockito测试用例,下面是类,我试图编写测试用例,但得到空对象 //Junit测试用例 但是下面的代码即使在模拟这个之后仍然返回空值,你能帮助如何模拟这个吗? 注意:只有Mockito需要使用无powermockito

  • 当我从spring-boot应用程序运行测试时,我得到了以下错误。我使用版本=2.3.3.和版本=2.2.0的进行集成测试。 null

  • 第一个问题:如何注入模拟(或真实?)HttpServletResponse在我对CXF JAX-RS服务endpoint进行单元测试期间? 我们的服务是如何设置的示例(注意我没有控制/权限来更改非测试结构): 测试类: 我可能在这里做错了几件事,但是我希望我只需要在我的自定义调用器中加入正确的“魔法”,以便正确地向我的endpoint注入HttpServlet响应。我要注意的是,在我没有注入上下文