Модульное тестирование Android Studio Textview - PullRequest
0 голосов
/ 04 марта 2020

Это мое основное занятие, которое получает массив json из URL. Моя проблема в том, что когда я пытаюсь выполнить модульное тестирование того, что должно быть в текстовом представлении, это дает мне исключение нулевого указателя.

publi c Класс MainActivity расширяет AppCompatActivity {

TextView txtJson;
ProgressDialog pd;
public static TextView testString;
String jsonString = null;
List<Location> locations;`enter code here`


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtJson = (TextView) findViewById(R.id.tvJsonItem);
    testString = (TextView) findViewById(R.id.test_for_string);

    new JsonTask().execute("https://wsu-dining-service.s3.amazonaws.com/current-menu.json");
}

protected void postCreate()
{
    mapStrinToClass();
    testString.setText(locations.get(0).getName());
}


private void mapStrinToClass()
{
    ObjectMapper objectMapper = new ObjectMapper();
    JsonFactory jsonFactory = objectMapper.getFactory();
    try {
        JsonParser jsonParser = jsonFactory.createParser(jsonString);
        locations = objectMapper.readValue(jsonString,
                new TypeReference<List<Location>>() {
                });
    } catch (IOException e) {
        e.printStackTrace();
    }

}


private class JsonTask extends AsyncTask<String, String, String> {

    protected void onPreExecute() {
        super.onPreExecute();

        pd = new ProgressDialog(MainActivity.this);
        pd.setMessage("Please wait");
        pd.setCancelable(false);
        pd.show();
    }

    protected String doInBackground(String... params) {


        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();


            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();
            String line = "";

            while ((line = reader.readLine()) != null) {
                buffer.append(line+"\n");
                Log.d("Response: ", "> " + line);   //here u ll get whole response...... :-)

            }

            return buffer.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (pd.isShowing()){
            pd.dismiss();
        }
        jsonString = result;
        postCreate();
    }
}

}

Мой модульный тест * Когда я запускаю приложение, текстовое представление заполняется "Обедом Тима и Жанны" Commons "но тест не пройден и говорит testString.getText (). ToString (); является нулевым

@Test
public void isMenuCorrect() {
    String menuTxt = MainActivity.testString.getText().toString();
    assert(menuTxt == "Tim & Jeanne's Dining Commons");

}

1 Ответ

0 голосов
/ 04 марта 2020

Прежде всего, вы должны использовать Espresso для запуска тестов пользовательского интерфейса в папке androidTest. Пример:

onView(allOf(withId(R.id.tvJsonItem), withText("Tim & Jeanne's Dining Commons")).check(matches(isDisplayed()));

По сути, мы здесь проверяем, отображается ли на экране представление с идентификатором R.id.tvJsonItem и текстом «Обеды Тима и Жанны». Теперь вопрос о том, как запускать тесты Espresso, выходит за рамки этого вопроса.

Во-вторых, ваш производственный код никогда не должен знать, что происходит в тестах, как вы создали TextView для использования в своих модульных тестах.

Наконец, никогда не сохраняйте статичные ссылки на ваши представления, поскольку вы не можете гарантировать, что ваша активность была создана к тому времени, когда вы пытаетесь получить к ним доступ. Фактически, представление должно быть увидено только его родителем. В вашем случае ссылка TextView должна быть частной в вашей деятельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...