2016-02-18 2 views
5

Ich versuche, einige gefälschte Objekte basierend auf JSON-Datei zu erstellen. So ist die Architektur von meinem Projekt sieht wie folgt aus:Wie liest man beim Testen mit Espresso die JSON-Datei aus dem Asset-Ordner?

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

Ich mache Tests mit Espresso und haben einige .json Dateien unter assets Ordner.

Mein Test-Klasse sieht wie folgt aus:

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

Das Problem ist in meiner MyServiceProvider Klasse:

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

Aus irgendwelchen Gründen InputStream inputStream = context.getAssets().open("FlightTypes.json"); kann nicht die JSON-Datei öffnen und Ausnahme auslöst. Dies ist mein Logbuch:

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) 

Jeder Vorschlag wäre willkommen. Vielen Dank.

Antwort

6

Übergeben Sie die Aktivität nicht als Kontext. Übergeben Sie stattdessen InstrumentationRegistry.getContext() und sehen Sie, ob das hilft.

+0

Sie sind genial ... ich meine Tätigkeit dachte das Problem könnte sein, aber nicht wissen, was ihr Ersatz ist. Vielen Dank... – Hesam

0

stand ich das gleiche Problem, und ich fand diese Abhilfe

 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); 
Verwandte Themen