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

Anu*_*kar 5 android unit-testing mockito powermockito

我有一个方法:

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我想测试一下这个方法.我已经模拟了view.getLayoutParams()方法.方法setMargin(int,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,top,right,bottom}, marginArray);
}
}
Run Code Online (Sandbox Code Playgroud)

Anu*_*kar 0

当我模拟视图时,视图实际上并未创建,这导致了这个问题。我使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)