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来满足两个代码分支(如果还有其他).

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...