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, top, right, bottom);
        }
        return layoutParams;
        }
    }

注意:变量left、top、right、bottom是在构造函数调用时初始化的实例变量。

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

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

这是我的测试用例代码:

@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,top,right,bottom}, marginArray);
}
}

您似乎对嘲讽的概念感到困惑。如果您模拟某个对象,则意味着它是一个伪对象(而不是真实对象),并且它的所有方法调用都是假的。

如果您希望边距为非零,LayoutParams(leftMargin, rightMargin, topMargin, bottomMargin),不要模拟viewsetMargin方法。

如果您的view对象不是真实的(模拟的、伪的等),则除非您使用某种模拟框架返回实际的layoutParams,否则layoutParams也是假的(表示未知值)。

简单地说,如果您希望通过调用setMargins来设置边距,请不要模拟setMargins方法调用,并确保layoutParams不是假的。

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

解决方案-在调用view.getLayoutParams()时使用适当的mocking方法返回适当的实际layoutParams对象或null,以满足代码的两个分支ifelse

希望它能帮助我,如果我误解了你的问题,请告诉我。

当我嘲笑视图时,实际上并没有创建视图,这导致了这个问题。我使用RobolectricTestRunner而不是PowerMockRunner,并使用shaddow应用程序上下文创建视图。它奏效了。。!

现在我的测试代码是:

@RunWith(RobolectricTestRunner.class)
public class MarginConverterTest {
private int left = 0;
private int right = 0;
private int top = 0;
private int bottom = 0;
View view;
@Before
public void setUp() throws Exception {
   view = new TextView(Robolectric.getShadowApplication().getApplicationContext());
}
/**
 * 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,top,right,bottom}, marginArray);
}
}

相关内容

  • 没有找到相关文章

最新更新