2016-02-18 8 views
5

Próbuję utworzyć fałszywe obiekty na podstawie pliku .json. Zatem architektura mojego projektu wygląda następująco:Jak odczytać plik json z folderu Zasób podczas testowania przez Espresso?

- MyProject 
- app 
---- src 
-------- androidTest 
------------ assets 
---------------- FirstObject.json 
---------------- SecondObject.json 
------------ java 
-------- main 
-------- test 

robię testy z espresso i jakieś .json plików pod assets folderu.

Moja klasa Test wygląda następująco:

@RunWith(AndroidJUnit4.class) 
public class LocatingActivityTest 
{ 
    @Rule 
    public ActivityTestRule<BookingActivity> mActivityTestRule = new ActivityTestRule<>(BookingActivity.class); 

    private BookingActivity mBookingActivity; 

    @Before 
    public void setup() 
    { 
     mBookingActivity = mActivityTestRule.getActivity(); 
    } 

    @Test 
    public void viewsMustBeVisible() 
    { 
     onView(withId(R.id.fab_booking)).perform(click()); 
     onView(withId(R.id.booking_book_now)).check(matches(not(isEnabled()))); 

     mBookingActivity.setTestBooking(BookingTest.getStandardFlight(), 
       MyServiceProvider.getServices1(mBookingActivity), // <= Problem 
       true, 
       MyServiceProvider.getServices2(mBookingActivity), // <= Problem 
       MyServiceProvider.getServices3(mBookingActivity)); // <= Problem 

     onView(withId(R.id.booking_book_now)).check(matches(isEnabled())); 
     onView(withId(R.id.booking_book_now)).perform(click()); 

     onView(withId(R.id.text)).check(matches(isCompletelyDisplayed())); 
     onView(withId(R.id.sonarView)).check(matches(isCompletelyDisplayed())); 
     onView(withId(R.id.cancel_booking)).check(matches(isCompletelyDisplayed())); 
    } 
} 

Problem jest w moim MyServiceProvider klasy:

public final class MyServiceProvider 
{ 
    public static List<FlightType> getServices1(Context context) 
    { 
     try 
     { 
      InputStream inputStream = context.getAssets().open("FlightTypes.json"); 
      String jsonString = read(inputStream); 
      Log.e("XXX", "getServices1() => " + jsonString); 
      Type listType = new TypeToken<List<FlightType>>(){}.getType(); 
      List<FlightType> flightTypeList = new Gson().fromJson(jsonString, listType); 

      return flightTypeList; 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    private static String read(InputStream inputStream) throws IOException 
    { 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(inputStream, writer, "UTF-8"); 
     return writer.toString(); 
    } 
. 
. 
. 
} 

Z jakichś powodów InputStream inputStream = context.getAssets().open("FlightTypes.json"); nie może otworzyć pliku json i wyrzuca wyjątek. To jest mój log:

02-17 21:00:58.984 5686-5706/com.xxx.xxx W/System.err: java.io.FileNotFoundException: FlightTypes.json 
02-17 21:00:58.984 5686-5706/com.xxx.xxx W/System.err:  at android.content.res.AssetManager.openAsset(Native Method) 
02-17 21:00:58.984 5686-5706/com.xxx.xxx W/System.err:  at android.content.res.AssetManager.open(AssetManager.java:313) 
02-17 21:00:58.984 5686-5706/com.xxx.xxx W/System.err:  at android.content.res.AssetManager.open(AssetManager.java:287) 
02-17 21:00:58.984 5686-5706/com.xxx.xxx W/System.err:  at com.xxx.xxx.utility.MyServiceProvider.getServices1(MyServiceProvider.java:31) 

Wszelkie sugestie będą mile widziane. Dzięki.

Odpowiedz

6

Nie przekazuj aktywności jako kontekstu. Zamiast tego należy przejść przez InstrumentationRegistry.getContext() i sprawdzić, czy to pomaga.

+0

Jesteś niesamowity ... Myślałam moja aktywność może być problem, ale nie wiem, co jest jego wymiana. Dzięki... – Hesam

0

I w obliczu tego samego problemu i znalazłem to obejście

 boolean thrown = false; 
     try { 
      AssetManager assetManager = mainActivity.getResources().getAssets(); 
      InputStream inputStream = assetManager.open("/my/rep/file_name"); 
     } catch (FileNotFoundException e) { 
      thrown = true; 
      e.printStackTrace(); 
     } 
     assertFalse(thrown);