Mockito / Power Mockito:在android中模拟LayoutParams的方法时无法获得预期的输出

我有一个方法

public class MarginConverter {
    int top = 0;
    int bottom = 0;
    int right = 0;
    int left = 0; 
    public MarginConverter(String val){
       top = bottom = right = left = Integer.parseInt(val);
    }

    public LayoutParams getLayoutParamsFromView(View view){
        LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();
        int height,width;
        if (layoutParams == null) {
            height = LayoutParams.WRAP_CONTENT;
            width = LayoutParams.MATCH_PARENT;
            layoutParams = new LayoutParams(width,height);
            layoutParams.setMargins(left,top,right,bottom);
        } else {
            layoutParams.setMargins(left,bottom);
        }
        return layoutParams;
        }
    }

注意:变量left,bottom是在构造函数调用时初始化的实例变量.

我想测试一下这个方法.我已经模拟了view.getLayoutParams()方法.方法setMargin(int,int,int)没有像上面提到的那样设置margin参数,我在测试中获得了LayoutParams(leftMargin,rightMargin,topMargin,bottomMargin)0.0的所有参数,尽管它在代码中正常工作.我该怎么做才能获得预期的价值.

请帮我 !任何帮助将不胜感激..

这是我的testCase代码

@RunWith(PowerMockRunner.class)
@PrepareForTest({ViewGroup.LayoutParams.class})
public class MarginConverterTest {
@Mock
private View view = mock(TextView.class);

private int left = 0;
private int right = 0;
private int top = 0;
private int bottom = 0;

@Before
public void setUp() throws Exception {
    when(view.getLayoutParams()).thenReturn(null);
}

/**
 * tests output for margin conversion when one argument is given
 */
@Test
public void test_OneArgumentMarginConversion(){
    left =top = right = bottom = 5;
    MarginConverter marginConverter = new marginConverter("5");
    LayoutParams params = marginConverter.getLayoutParamsFromView(view);
    Object[] marginArray = new Object[4];
    marginArray[0] = params.leftMargin;
    marginArray[1] = params.topMargin;
    marginArray[2] = params.rightMargin;
    marginArray[3] = params.bottomMargin;
    Assert.assertArrayEquals(new Object[]{left,bottom},marginArray);
}
}
最佳答案
你似乎对嘲弄的概念感到困惑.如果你嘲笑某事,那就意味着它是一个虚拟(不是真实的对象),它的所有方法调用都是假的.

如果你希望边距不为零,则LayoutParams(leftMargin,bottomMargin)不要模拟视图或setMargin方法.

如果你的视图对象不是真实的(模拟,虚拟等),你的layoutParams也是假的(意味着未知的值),除非你通过使用一些模拟框架返回一个实际的layoutParams.

简单来说,如果你想通过调用setMargins设置边距,不要模拟setMargins方法调用并确保layoutParams不是假的.

此外,在您的情况下,如果视图被模拟,则条件if(layoutParams == null)永远不会被满足,因为layoutParams将是非null的伪对象.

解决方案 – 在调用view.getLayoutParams()时使用适当的模拟方法返回适当的实际layoutParams对象,或使用null来满足两个代码分支(如果还有其他).

希望它有所帮助,让我知道我是否误解了你的问题.

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...