Я создал приложение, которое позволяет пользователям создавать транзакции. Когда эта транзакция создается, она добавляется в базу данных (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);
}
}
Надеюсь, я предоставил достаточно информации. Я был бы признателен за любую помощь, которую кто-либо может дать мне.
Я хотел бы добавить, что я также прочитал все руководства на веб-сайте разработчиков Android. Из комбинации этих ресурсов я провел базовый модульный тест, чтобы проверить, что активность действительно запускается. Я также знаю, что эти флаги работают, поскольку я тестировал их вручную, однако этот проект требует, чтобы я проверил их с помощью модульного тестирования.
@Neijwiert Ну, теперь я, конечно, чувствую себя тупым .. Какой тест вы бы назвали это?
Я хочу сказать, что тестирование базы данных — это не модульное тестирование, а интеграционное тестирование. В модульном тесте вы будете издеваться над базами данных.
@Neijwiert ах, да, извините, это был долгий день. Да, я изменил свой вопрос/теги, чтобы отразить то, что я имел в виду. Я пытаюсь использовать Mockito для этого.




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