Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read json file from Asset folder when testing by Espresso?

I'm trying to create some fake objects based on .json file. So the architecture of my project looks like this:

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

I'm doing testing with Espresso and have some .json files under assets folder.

My test class looks like this:

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

The problem is in my MyServiceProvider class:

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

For some reasons InputStream inputStream = context.getAssets().open("FlightTypes.json"); cannot open the json file and exception throws. This is my 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)
like image 594
Hesam Avatar asked Feb 18 '16 02:02

Hesam


1 Answers

Do not pass the activity as the context. Instead pass InstrumentationRegistry.getContext() and see if that helps.

like image 137
greenrobo Avatar answered Oct 21 '22 10:10

greenrobo