Robolectric自定义阴影不会被拾取

问题描述

我正在尝试测试一个viewmodel类,该类实例一个Timer的实例,并在该类的init块中安排一个任务。为了模拟Timer的行为,我决定创建一个自定义阴影,该阴影过去对我有用。但是我不清楚为什么它对此不起作用。

要测试的课程

class Myviewmodel(application: Application) : Androidviewmodel(application) {
    private val timer: Timer

    init {
        timer = Timer()
        timer.scheduleAtFixedrate(...)
    }
}

测试类

@RunWith(RobolectricTestRunner::class)
@Config(sdk = [23],shadows = [TimerShadow::class])
class FactorListviewmodelUnitTest {

    private lateinit var sut: Myviewmodel
    private lateinit var timer: Timer
    private lateinit var timerShadow: TimerShadow

    @Before
    fun setup() {
        ...
        sut = Myviewmodel(application)
        ...
        timer = someCodeUsingReflectionToGetField(sut,"timer") as Timer // this line works
        timerShadow = Shadow.extract<TimerShadow>(timer)  // ClassCastException here
    }

}

TimerShadow

@Implements(Timer.class)
public class TimerShadow {

    private TimerTask mTimerTask;
    private long mDelay;
    private long mPeriod;

    @Implementation
    @SuppressWarnings("checkstyle:methodname")
    public void __constructor__() {
        mDelay = 0;
    }

    @Implementation
    public void scheduleAtFixedrate(TimerTask task,long delay,long period) {
        mTimerTask = task;
        mDelay = delay;
        mPeriod = period;
    }

    public TimerTask getTimerTask() {
        return mTimerTask;
    }

    public long getDelay() {
        return mDelay;
    }

    public long getPeriod() {
        return mPeriod;
    }
}

尝试提取阴影时遇到的异常是java.lang.classCastException: java.util.Timer cannot be cast to org.robolectric.internal.bytecode.Shadowedobject。放入各种断点,我发现我从来没有进入影子的构造函数实现,并且可以看到Timer中的sut对象是真实的Timer,而在其他情况下,阴影起作用,阴影的构造函数被拾取,我在阴影对象中看到__robo_data__

我想念什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)