Здравейте момчета, използвам Robolectric и Mockito и mockito при тестване на единици, стигнах до момент, в който трябва да проверя данни, които зависят от извикване на заявка за API.
Как кодирате, така че вашите извиквания на Rest api да използват фиктивни данни при изпълнение на тест на единица?
В моя StockFragment.java използвам SpringAndroid + Robospice, за да извърша извикване на Rest Api.
Също така имам 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
}
}
Едно решение, което мисля, е да има флаг testMode в StockFragment и да направи някои условни изрази, които ще върнат тестови данни, ако са верни, но мисля, че има по-добър начин за тестване.
Мисля, че трябва да слушам Http заявките в моя тестов клас и да хвана тази заявка, след което да предоставя фиктивни данни, но не съм сигурен.
Забележка: Robolectric е настроен и е потвърдено, че работи и е тестван. Въпреки че не ги включих в кодовия фрагмент по-горе. Roboguice се използва и като инжекции.
ClassCastException
, тъй катоFragmentTestUtil
ще се опита да прикачи фрагмент към екземпляр наActivity
, а не наBaseActivity
- person Eugen Martynov   schedule 04.02.2015StubException
, защото трябва да използватеRobolectricTestRunner
- person Eugen Martynov   schedule 04.02.2015