2016-05-06 10 views
5

にLayoutParamsの方法をからかったときに期待される出力を取得することができません、私は方法があります。Mockito /パワーMockito:アンドロイド

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

注:左の変数、上、右、下には、コンストラクタ呼び出しで初期化されたインスタンス変数ですが。

このメソッドをテストします。私は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); 
} 
} 

答えて

0

私はビューをモックしていたので、この問題につながるビューは実際には作成されませんでした。私はPowerMockRunnerの代わりにRobolectricTestRunnerを使い、shaddowアプリケーションコンテキストを使ってビューを作成しました。そして、それは働いた..!

今私のtestcodeは次のとおりです。私は、関数から返されるLayoutParamsにする必要があります適用どんなマージンチェックしたい

@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); 
} 
} 
3

。あなたが何かを模倣すれば、それはそのダミー(実際のオブジェクトではない)を意味し、そのメソッド呼び出しはすべて偽である。

あなたはゼロであることを余白を希望する場合は、LayoutParams(leftMargin, rightMargin, topMargin, bottomMargin)は、viewまたはsetMargin方法を模擬しません。あなたのviewオブジェクトが本物でない場合は(嘲笑、ダミーなど)

、あなたのlayoutParamsはあなたには、いくつかのモックフレームワークを使用して、実際のlayoutParamsを返却されない限り、あまりにも(未知の値を意味する)偽の一つです。

setMarginsを呼び出して余白を設定する場合は、setMarginsメソッド呼び出しをモックしないで、layoutParamsが偽物でないことを確認してください。

また、viewが偽装されている場合、layoutParamsはnull以外の偽のオブジェクトになるため、条件if (layoutParams == null)は決して満たされません。

ソリューション - 両方のコード、ifの枝ならびにelseを満たすために適切な実際のlayoutParamsオブジェクトまたはnullを返すためにコール​​に適切なモックメソッドを使用します。

私はあなたの質問を誤解した場合、それが助けて私に知らせてくれることを願っています。

+0

。あなたのソリューションは、コードの両方の分岐をテストするのに役立ちました。しかし、私の質問は変わりません。 setMarginsメソッドの呼び出し時にlayoutParamsのフィールドの値を設定できるようにするにはどうすればよいですか。 –

+0

質問を編集してテストコードを表示してください。 –

+0

テストメソッドで 'marginConverter.getLayoutParams(view)'を呼び出していますが、テストしたいメソッドが 'getLayoutParamsFromView'であり、そのメソッドがあなたのテストから呼び出されているのを見ていません。何か不足していますか?ビット&ピースで情報を提供しているようです。 –