我有一个方法:
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)
,不要模拟view
或setMargin
方法。
如果您的view
对象不是真实的(模拟的、伪的等),则除非您使用某种模拟框架返回实际的layoutParams
,否则layoutParams
也是假的(表示未知值)。
简单地说,如果您希望通过调用setMargins
来设置边距,请不要模拟setMargins
方法调用,并确保layoutParams
不是假的。
此外,在您的情况下,如果view
被模拟,条件if (layoutParams == null)
将永远不会被满足,因为layoutParams
将是一个非null伪对象。
解决方案-在调用view.getLayoutParams()
时使用适当的mocking方法返回适当的实际layoutParams
对象或null
,以满足代码的两个分支if
和else
。
希望它能帮助我,如果我误解了你的问题,请告诉我。
当我嘲笑视图时,实际上并没有创建视图,这导致了这个问题。我使用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);
}
}