1

こんにちは皆さん、単体テストで Robolectric と Mockito と mockito を使用しています。API要求呼び出しに依存するデータを検証する必要があるところまで来ました。

単体テストの実行時に Rest API 呼び出しがモック データを使用するようにコーディングするにはどうすればよいですか?

StockFragment.java 内で、SpringAndroid + Robospiceを使用して Rest Api 呼び出しを実行します。
また、リクエストが成功したかどうかにかかわらず、フラグメント内の UI を更新する RequestListener (Robospice から) がフラグメント内にあります。

これが私のフラグメントです:

   public class StockFragment extends RoboDialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.my_layout, container, false);
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        displayStockInfo();
    }

    private void displayStockInfo(){
        request = new MyRequest();
        request.setQuote(getStock().getSymbol());
        lastRequestCacheKey = request.createCacheKey();
        ((BaseActivity)getActivity()).getSpiceManager().execute(request, lastRequestCacheKey, DurationInMillis.ALWAYS_EXPIRED, new MyRequestListener());
    }

    private class MyRequestListener implements RequestListener<PseStocksResponse> {
        @Override
        public void onRequestFailure(SpiceException e) {
            //show toast about failure reason ...
        }
        @Override
        public void onRequestSuccess(PseStocksResponse pseStocksResponse) {
            //UPDATE UI VIEWS ...
        }
    }
}

これが私の Robolectric Test クラスです。

   public class StockFragmentTest {
    MyRequest request;
    Stock stock;
    StockFragment stockFragment;

    @Before
    public void setUp(){
        stockFragment = new StockFragment();
        FragmentTestUtil.startFragment(stockInfoFragment);
        FragmentTestUtil.startVisibleFragment(stockInfoFragment);
        findViews();
    }

    public void findViews(){
        quoteTextView = (TextView)stockInfoFragment.getView().findViewById(R.id.quoteTextView);
        nameTextView = (TextView)stockInfoFragment.getView().findViewById(R.id.nameTextView );
        ...
    }

    @Test
    public void viewShouldNotBeNull(){
        assertNotNull(quoteTextView);
        assertNotNull(nameTextView);
        ...
    }

    @Test
    public void showDisplayedInfo(){
        //TODO: Assert textview.getText() values here
    }
}

私が考えている解決策の 1 つは、StockFragment にtestModeフラグを設定し、true の場合にテスト データを返すいくつかの条件文を実行することですが、もっと良いテスト方法があると思います。
Test クラスで Http リクエストをリッスンし、そのリクエストをキャッチしてからモック データを提供する必要があると思いますが、よくわかりません。

: Robolectric はセットアップされ、動作が確認され、テストされています。上記のコード スニペットには含めていませんが。Roboguice は注射剤としても使用されます。

4

2 に答える 2

0

のような依存性注入フレームワークを使用することをお勧めしますDagger。フレームワークがどのように機能するかを理解するには、長い時間がかかる可能性があります。例を見てみましょう。

ビューからネットワーク ロジックを削除することもお勧めします。に保管してくださいActivity

また、(オプションで) 特定のネットワーク フレームワークの使用に関する概念を非表示にします - RoboSpice.

今のところ、次のステップでテストを修正できます。

Robolectric を使用してテストを実行します。

@RunWith( RobolectricTestRunner.class )
@Config( reportSdk = 18, emulateSdk = 18 )
public class StockFragmentTest {...}

のモックを追加SpiceManager:

...
public class StockFragmentTest 
{
    @Mock
    SpiceManager mockedSpiceManager;

    @Before
    public void setUp()
        throws Exception
    {
        MockitoAnnotations.initMocks( this );
        ...
    }
    ...
}

テスト アクティビティを作成します。

public class StockFragmentTest 
{
    ...
    public class TestBaseActivity extends BaseActivity 
    {
        @Override
        SpiceManager getSpiceManager() 
        {
            return mockedSpiceManager;
        }
    }
}

テスト アクティビティを使用します。

@Before
public void setUp()
{
    ...
    stockFragment = new StockFragment();
    FragmentTestUtil.startVisibleFragment( stockFragment, TestBaseActivity.class, <id of placeholder in xml for BaseActivity> );
    ...
}

最後のスニペットはあなたのコードには当てはまらないと思います。あなたはおそらく持っていStockActivityます。したがってTestStockActivity、類推して作成し、 の使用法を置き換える必要がありBaseTestActivityます。ただし、このアプローチにはより多くの副作用が予想されます。適切な依存性注入が役立ちます

于 2015-02-04T11:07:23.003 に答える
0

Robolectric には、回答を準備できる偽の http レイヤーが既に含まれています。

詳細と例は、 Android http testing with Robolectricの回答にあります。

于 2015-02-10T07:12:23.717 に答える