So here is the scenario, your android app has a lot of json files in the assets
folder that are used to load some data when in first runs.
You are writing some unit tests, and want to make sure the integrity of the data in the assets/*.json are preserved.
You’d assume, that reading JSON files should not involve using the Android Runtime in any way, and we should be able to read JSON files in local JVM as well. But you’re wrong. The JSONObject and JSONArray classes of Android are part of android.jar, and hence
JSONObject myJson = new JSONObject(someString);
The above code will not work when running unit tests on local JVM.
Fortunately, our codebase already using Google’s GSoN library to parse JSON, and that works on local JVM too (because GSoN is a core Java library, not specifically an Android library).
Now the second problem that comes is that when running unit tests on local JVM we do not have the getResources()
or getAssets()
functions.
So how do we retrieve a file from the assets folder ?
So what I found out (after a bit of trial and error and poking around with various dir paths), is that the tests are run from the app folder (app being the Android application module – it is named app by default by Android Studio, though you might have had named it differently)
So in the tests file you can define at the beginning
public static final String ASSET_BASE_PATH = "../app/src/main/assets/";
And also create the following helper function
public String readJsonFile (String filename) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(ASSET_BASE_PATH + filename)));
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
line = br.readLine();
}
return sb.toString();
}
Now wherever you need this JSON data you can just do the following
Gson gson = new GsonBuilder().create();
events = gson.fromJson(readJsonFile("events.json"),
Event.EventList.class);
eventDatesList = gson.fromJson(readJsonFile("eventDates.json"), EventDates.EventDatesList.class);
You must be logged in to post a comment.