Модульное тестирование базы данных Firebase с Android

Я создал приложение, которое позволяет пользователям создавать транзакции. Когда эта транзакция создается, она добавляется в базу данных (Firebase Realtime Database). После создания транзакции необходимо выполнить ряд утверждений, прежде чем транзакция будет выполнена.

Чтобы утвердить транзакцию, пользователь должен щелкнуть транзакцию на странице запросов транзакций, которая отображает желаемые транзакции. Как только пользователь нажимает на эту транзакцию, пользователю показывается соответствующее диалоговое окно. Когда пользователь нажимает кнопку «одобрить» в этом диалоговом окне, значение соответствующего «флага» в базе данных устанавливается равным true.

Я пытаюсь написать тест, используя Mockito, чтобы проверить, действительно ли для этого флага установлено значение true, но я изо всех сил пытаюсь это сделать. Я просмотрел несколько видеороликов о модульном тестировании в студии Android на YouTube и прочитал все сообщения здесь, которые касаются модульного тестирования firebase с помощью студии Android, но я все еще не смог выполнить желаемый тест.

Поскольку мои исследования завели меня в тупик, я надеялся, что кто-то здесь может либо направить меня в правильном направлении к некоторому примеру кода, который я еще не видел, либо, что еще лучше, помочь мне написать нужный тест.

Код, который я пытаюсь проверить, находится в этом классе:

public class Request extends AppCompatActivity {

private static final String TAG = "Request";

//Firebase Stuff
FirebaseDatabase database;
DatabaseReference start, ref;
DatabaseReference user;

RecyclerView recycler_menu;
RecyclerView.LayoutManager layoutManager;

Dialog custDialog;

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

    final String passedEmail = getIntent().getStringExtra("Email");

    //Init Firebase
    database = FirebaseDatabase.getInstance();
    start = database.getReference("Transaction");
    ref = database.getReference("User");

    //Load Menu
    recycler_menu = findViewById(R.id.recycler_menu);
    recycler_menu.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recycler_menu.setLayoutManager(layoutManager);

    loadMenu();
}

private void loadMenu() {
    FirebaseRecyclerAdapter<Transaction, TransRequestHolder> adapter = new FirebaseRecyclerAdapter<Transaction, TransRequestHolder>(Transaction.class, R.layout.trans_item, TransRequestHolder.class, start) {
        @Override
        protected void populateViewHolder(TransRequestHolder viewHolder, final Transaction model, int position) {
            final String passedUserType= getIntent().getStringExtra("userType");
            final String passedEmail= getIntent().getStringExtra("Email");
            final String receiver = model.getReceiver().replace('.', ' ');
            final String shopA = model.getShopA().replace('.', ' ');

            //custB
            if (passedEmail.equalsIgnoreCase(model.getReceiver()) && model.getCustflag() == false) {
                viewHolder.txtTransactionA.setText(model.getAmount());
                viewHolder.txtTransactionC.setText(model.getCurrency());
                viewHolder.txtTransactionR.setText(model.getReceiver());
                final Transaction clickItem = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(android.view.View view, int position, boolean isLongClick) {
                        Toast.makeText(Request.this, "Receiving: " + shopA, Toast.LENGTH_SHORT).show();
                        final String key = model.getKey();
                        custDialog = new Dialog(Request.this);
                        custDialog.setContentView(R.layout.dialog_template);
                        final EditText Write = custDialog.findViewById((R.id.write));
                        Button Approve = custDialog.findViewById(R.id.approve);

                        Write.setEnabled(true);
                        Approve.setEnabled(true);

                        Approve.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                String newShopB = Write.getText().toString().replace(".", " ");
                                start.child(key).child("custflag").setValue(true);
                                start.child(key).child("shopB").setValue(newShopB);
                                Toast.makeText(Request.this, "CustB Approval", Toast.LENGTH_SHORT).show();
                                custDialog.cancel();
                            }
                        });
                        custDialog.show();
                    }
                });
            }
            //shopA
            else if (passedEmail.equalsIgnoreCase(model.getShopA()) && (model.getCustflag() == true && model.getShopAflag() == false)) {
                viewHolder.txtTransactionA.setText(model.getAmount());
                viewHolder.txtTransactionC.setText(model.getCurrency());
                viewHolder.txtTransactionR.setText(model.getReceiver());
                final Transaction clickItem = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(android.view.View view, int position, boolean isLongClick) {
                        Toast.makeText(Request.this, "Receiving: " + shopA, Toast.LENGTH_SHORT).show();
                        final String key = model.getKey();
                        //Dialog option number one
                        customDialog("Transaction Approval", "Are you sure you want to approve this transaction?", "cancel", "okMethod2", passedEmail, key);
                    }
                });
            }
            //shopB
            else if (passedEmail.equalsIgnoreCase(model.getShopB()) && (model.getShopAflag() == true && model.getShopBflag() == false)) {
                viewHolder.txtTransactionA.setText(model.getAmount());
                viewHolder.txtTransactionC.setText(model.getCurrency());
                viewHolder.txtTransactionR.setText(model.getReceiver());
                final Transaction clickItem = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(android.view.View view, int position, boolean isLongClick) {
                        Toast.makeText(Request.this, "Receiving: " + shopA, Toast.LENGTH_SHORT).show();
                        final String key = model.getKey();
                        //Dialog option number one
                        customDialog("Transaction Approval", "Are you sure you want to approve this transaction?", "cancel", "okMethod3", passedEmail, key);
                    }
                });
            }
            else {
                viewHolder.itemView.setVisibility(View.GONE);
            }
        }
    };
    recycler_menu.setAdapter(adapter);
}

}

Надеюсь, я предоставил достаточно информации. Я был бы признателен за любую помощь, которую кто-либо может дать мне.

Модульное тестирование базы данных не является модульным тестом.

Neijwiert 20.03.2019 16:54

Я хотел бы добавить, что я также прочитал все руководства на веб-сайте разработчиков Android. Из комбинации этих ресурсов я провел базовый модульный тест, чтобы проверить, что активность действительно запускается. Я также знаю, что эти флаги работают, поскольку я тестировал их вручную, однако этот проект требует, чтобы я проверил их с помощью модульного тестирования.

C.Gibbons 20.03.2019 16:56

@Neijwiert Ну, теперь я, конечно, чувствую себя тупым .. Какой тест вы бы назвали это?

C.Gibbons 20.03.2019 16:57

Я хочу сказать, что тестирование базы данных — это не модульное тестирование, а интеграционное тестирование. В модульном тесте вы будете издеваться над базами данных.

Neijwiert 20.03.2019 16:57

@Neijwiert ах, да, извините, это был долгий день. Да, я изменил свой вопрос/теги, чтобы отразить то, что я имел в виду. Я пытаюсь использовать Mockito для этого.

C.Gibbons 20.03.2019 17:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
742
0

Другие вопросы по теме