Mockito/Power Mockito:在 android 中模拟 LayoutParams 方法时无法获得预期的输出
Mockito/Power Mockito : unable to get expected output when mocking method of LayoutParams in android
我有一个方法:
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,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
也是假的(意味着未知值),除非您是 return 一个真实的对象layoutParams
通过使用一些模拟框架。
简单来说,如果您希望通过调用 setMargins
来设置边距,请不要模拟 setMargins
方法调用并确保 layoutParams
不是假的。
此外,在您的情况下,如果 view
被模拟,条件 if (layoutParams == null)
将永远不会被满足,因为 layoutParams
将是一个非空的假对象。
解决方案 - 使用适当的模拟方法调用 view.getLayoutParams()
到 return 适当的真实 layoutParams
对象或 null
满足代码的两个分支,if
以及 else
。
希望对您有所帮助,如果我误解了您的问题,请告诉我。
因为我在模拟视图,实际上并没有创建视图,这导致了这个问题。我使用 RobolectricTestRunner 而不是 PowerMockRunner 并使用 shadow 应用程序上下文创建了视图。它奏效了……!
现在我的测试码是:
@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);
}
}
我有一个方法:
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,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
也是假的(意味着未知值),除非您是 return 一个真实的对象layoutParams
通过使用一些模拟框架。
简单来说,如果您希望通过调用 setMargins
来设置边距,请不要模拟 setMargins
方法调用并确保 layoutParams
不是假的。
此外,在您的情况下,如果 view
被模拟,条件 if (layoutParams == null)
将永远不会被满足,因为 layoutParams
将是一个非空的假对象。
解决方案 - 使用适当的模拟方法调用 view.getLayoutParams()
到 return 适当的真实 layoutParams
对象或 null
满足代码的两个分支,if
以及 else
。
希望对您有所帮助,如果我误解了您的问题,请告诉我。
因为我在模拟视图,实际上并没有创建视图,这导致了这个问题。我使用 RobolectricTestRunner 而不是 PowerMockRunner 并使用 shadow 应用程序上下文创建了视图。它奏效了……!
现在我的测试码是:
@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);
}
}