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

无法使用匕首注射模拟

赫连法
2023-03-14

我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。

这是模块:

@模块类自动关闭倒计时模块{

@Provides
@Singleton
fun getAutoCloseCountDownTimer(
    userInteractionClient: UserInteractionClient,
    rxPositionManager: RxPositionManager
): AutoCloseCountDownTimer {
    return AutoCloseCountDownTimer(userInteractionClient, rxPositionManager, 15000, 45000)
}

这就是我在单元测试中模拟AutoCloseCountDown类的方法:

@RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{

@Mock
private AutoCloseCountDownTimer autoCloseCountDownTimer;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void basicTest() {
    final AutoCloseCountDownTimer.Listener mockListener = Mockito.mock(AutoCloseCountDownTimer.Listener.class);
    autoCloseCountDownTimer.registerListener(mockListener);

    final int expectedValue = 10;
    autoCloseCountDownTimer.notifyOnAutoClose(expectedValue);
    Mockito.verify(mockListener).onAutoClose(expectedValue);

如何实现自动关闭的CountDownTimer将在测试中使用,其值由匕首预先定义

共有1个答案

苍恩
2023-03-14

你通常不会尝试这样做。在测试中,通常不会将参数注入到被测试对象中,而是通过new直接传递它们。可以是常规项目或模拟项目。

如果您确实需要注入,您需要设置一个模块,该模块通过一个用@Provides注释的函数提供对象,并在实例化对象时创建mock并将其传递到参数中。您还需要对您没有嘲笑的任何依赖项进行传递。然后为该模块和您需要的任何其他模块创建一个组件,并使用该组件进行注入。但是如果可能的话,您真的希望避免这种情况,单元测试应该是关于测试小部分功能的。

 类似资料:
  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

  • 我使用Flink(最新的git)从Kafka流到卡桑德拉。为了简化单元测试,我通过dagger添加了依赖注入。 ObjectGraph似乎正确地设置了自己,但是“内部对象”被Flink标记为“不可序列化”。如果我直接包括这些对象,它们会起作用--那么有什么区别呢? 通过Dagger Lazy 实例化的对象也不会序列化。 线程“main”org.apache.flink.api.common.inv

  • 嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。 Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。 但是我如何才能得到这个注入,我应该在哪里启动我的图表? 我想做的就是: 我看了这个例子(htt

  • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

  • 我在用匕首2对付科特林。所有工作都很好,但是当我试图将SharedPreferences注入活动时,我的项目甚至不能创建。Gradle控制台说: di\appcomponent.java:6:error:[dagger.android.androidinjector.inject(T)]android.content.sharedpreferences不是nullable,而是由@org.jetb

  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。