android - Mockito/电源 Mockito : unable to get expected output when mocking method of LayoutParams in android

标签 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;
        }
    }

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

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

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

这是我的测试用例代码:

@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 对象不是真实的(mocked,dummy 等),你的 layoutParams 也是假的(意味着未知值),除非你返回一个实际的 layoutParams 通过使用一些模拟框架。

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

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

解决方案 - 在调用 view.getLayoutParams() 时使用适当的模拟方法返回适当的真实 layoutParams 对象或 null 来满足代码的两个分支,if 以及 else

希望对您有所帮助,如果我误解了您的问题,请告诉我。

关于android - Mockito/电源 Mockito : unable to get expected output when mocking method of LayoutParams in android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37064759/

相关文章:

android - 将音频文件存储在数据库中

android - 如何在不属于自己的手机上进行调试?

css - 点网-MVC : Testing for validating css minification

unit-testing - 单元测试组合的数量惊人

java - Mockito 无法为 @Async 方法注入(inject)模拟

java - 在 Matchers.eq 中调用 spy 方法时,参数匹配器的使用无效

android - 对 Android CardView 的顶部部分进行颜色处理,同时保持圆角

python - 如何模拟python中导入的pypi库使用的函数调用

java - JUnit 5 测试中模拟 EhCache NullPointerException

android - 在没有调用 Activity 的情况下显示 DialogFragment 作为背景