android–Mockito runnable:想要但是没有被调用?

android–Mockito runnable:想要但是没有被调用?,第1张

概述在提交错误报告之前,我想确保自己没有做错事.这真的很奇怪.设置:robolectric3.0;mockito1.10.19被测单位:publicBbScrollView(Contextcontext){this(context,null);}publicBbScrollView(Contextcontext,AttributeSetattrs){super(context,attrs);

在提交错误报告之前,我想确保自己没有做错事.这真的很奇怪.设置:

robolectric 3.0; mockito 1.10.19

被测单位:

public BbScrollVIEw( Context context ){  this( context, null );}public BbScrollVIEw( Context context, AttributeSet attrs ) {  super( context, attrs );  mScrollTask = new Runnable() {    public voID run() {      checkForStopped();    }  };}public voID checkForStopped(){  int newposition = getScrollY();  // the rest is irrelevant , but I hit a breakpoint here.}public voID startScrollTask() {  mInitialposition = getScrollY();  postDelayed( mScrollTask, mTimeUntilNextCheckForStopped );}

考试:

@RunWith(RobolectricGradleTestRunner.class)@Config(constants = BuildConfig.class, sdk = 21)public class BbScrollVIEwTests {  @Test  public voID test_startScrollTask(){    BbScrollVIEw uut = spy( new BbScrollVIEw( RuntimeEnvironment.application ) );    // This calls the method above that enqueues the runnable    uut.startScrollTask();    // Robolectric runs the runnable    ShadowLooper.runUiThreadTasksIncludingDelayedTasks();    // I can hit a breakpoint insIDe this method but verify() fails    verify( uut ).checkForStopped();  }}

测试失败了:

Wanted but not invoked:bbScrollVIEw.checkForStopped();-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:62)However, there were other interactions with this mock:bbScrollVIEw.startScrollTask();-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:58)bbScrollVIEw.getScrollY();-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:58)bbScrollVIEw.$$robo$getData();-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:58)bbScrollVIEw.postDelayed(    com.myapp.androID.BbKit.vIEw.BbScrollVIEw@7f830761,    100);-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:58)bbScrollVIEw.$$robo$getData();-> at com.myapp.androID.BbKit.test.vIEw.BbScrollVIEwTests.test_startScrollTask(BbScrollVIEwTests.java:58)

我再说一遍:我在验证()检查但测试失败的方法中遇到了断点.我也尝试在checkForStopped()中创建一个虚方法,并验证它无济于事.我还在robolectric UI线程调用的任一侧尝试了1000ms thread.sleep.我的猜测是在robolectric和mockito的反射之间进行交互吗?

解决方法:

基于这个Mockito原则,你已经发现了一个非常有趣的预期但不直观的行为:创建一个间谍,Mockito makes a shallow copy of the original object.

在构造函数中创建匿名内部Runnable时,Runnable包含对BbScrollVIEw.this的隐式引用,即原始BbScrollVIEw对象.然后,在创建间谍时进行复制,并且对原始BbScrollVIEw的引用仍然存在.这意味着你对checkForStopped的调用发生在Mockito无法观察到的原始对象上,而不是间谍.

解决此问题的一种方法是将您的匿名内部Runnable创建移动到您的startScrollTask​​方法,在间谍上调用,因此这指的是间谍.运行Runnable时,它将调用间谍上的方法而不是真实对象,允许Mockito拦截并验证呼叫.

总结

以上是内存溢出为你收集整理的android – Mockito runnable:想要但是没有被调用?全部内容,希望文章能够帮你解决android – Mockito runnable:想要但是没有被调用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1108080.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存