0

AndroidJunitテストを作成する必要があります。そして、ソースはこのようになります:

public class A extends Activity{

    private classB mB;
    private int mType = 2; 

    somebutton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                       mB.showDialog(
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                 //next line is the modified and I have to make test file                               
                                  mB.setType(mType);
                                }
                            }
                       )
                }
        }
  }

そして、テストクリックボタンを使用して、他のすべての必要なものを準備することもできますが、Trueをアサートする方法を教えてください。また、「getType()」はなく、「mB」の「Type」はプライベートです。

お時間をいただきありがとうございます。

4

1 に答える 1

0

すべてのSDKクラスがスタブ化されており、それらを再コンパイルする場合にのみ有効であり、デバイスまたはエミュレーターでユニットテストを実行することはPITAであるため、アンドロイドでのユニットテストは困難です

代替手段は嘲笑です。[最も] 適切なモック フレームワークは JMockit です (最終的なプライベート スタティックをモックできます - また、あなたが夢見ることができるすべてのもの)

Android クラスに対して jmockit を使用する小さな例を次に示します。

/**
 * shall inject assignable views   into
 */
@Test
public void testSimpleInjection(@Mocked final WithInjectableViews injectable,
                                @Mocked final TextView textView,
                                @Mocked final Button button) {

    new Expectations() {
        {
            injectable.findViewById(239);
            returns(textView);


            injectable.findViewById(555);
            returns(button);


        }
    };

    ViewInjector.startActivity(injectable);

    assertEquals(textView, Deencapsulation.getField(injectable, "asView"));
    assertEquals(button, Deencapsulation.getField(injectable, "button"));
    assertNull(Deencapsulation.getField(injectable, "notInjected"));

}


class WithInjectableViews extends Activity {
    // shall be injected
    @InjectView(id = 239)
    private android.view.View asView;
    @InjectView(id = 555)
    private Button button;
    // shall be left alone
    private View notInjected = null;

}

(完全なソース: https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java )

ただし、匿名の内部クラスをモックアップするのは難しいため、何らかの方法でリファクタリングする必要がある場合があります。証明フィールドとメソッドへのアクセスに関して - jmockit は、untility クラス Deencalsulation を提供します-ほとんどすべてのアクセス制約を無視します。

于 2012-09-14T09:10:06.920 に答える