2016-02-18 14 views
5

Sto provando a creare alcuni oggetti falsi basati sul file .json. Così l'architettura del mio progetto è simile al seguente:Come leggere il file json dalla cartella Asset durante il test di Espresso?

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

che sto facendo test con Espresso e hanno alcuni file nella cartella .jsonassets.

mia classe di test si presenta così:

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

Il problema è nella mia classe MyServiceProvider:

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(); 
    } 
. 
. 
. 
} 

Per alcuni motivi InputStream inputStream = context.getAssets().open("FlightTypes.json"); non può aprire il file JSON ed eccezione getta. Questo è il mio 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) 

Qualsiasi suggerimento sarebbe apprezzato. Grazie.

risposta

6

Non passare l'attività come contesto. Invece passa InstrumentationRegistry.getContext() e vedi se questo aiuta.

+0

Si sono impressionanti ... Stavo pensando la mia attività potrebbe essere il problema, ma non sapevo che cosa è la sua sostituzione. Grazie... – Hesam

0

Ho affrontato lo stesso problema, e ho trovato questa soluzione

 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); 
Problemi correlati