Java 用Android对Firebase数据库进行单元测试

Java 用Android对Firebase数据库进行单元测试,java,android,firebase,mockito,Java,Android,Firebase,Mockito,我已经创建了一个允许用户创建交易的应用程序。创建此事务时,它将添加到数据库(Firebase实时数据库)。创建交易后,必须在执行交易之前进行一系列批准 为了批准交易,用户必须在显示所需交易的交易请求页面上单击该交易。用户单击此事务后,将显示相关对话框。当用户单击此对话框上的“批准”按钮时,数据库中相应“标志”的值设置为true 我正试图用Mockito编写一个测试来测试这个标志是否真的被设置为true,但我很难做到这一点。我在youtube上观看了多个关于android studio单元测试的视

我已经创建了一个允许用户创建交易的应用程序。创建此事务时,它将添加到数据库(Firebase实时数据库)。创建交易后,必须在执行交易之前进行一系列批准

为了批准交易,用户必须在显示所需交易的交易请求页面上单击该交易。用户单击此事务后,将显示相关对话框。当用户单击此对话框上的“批准”按钮时,数据库中相应“标志”的值设置为true

我正试图用Mockito编写一个测试来测试这个标志是否真的被设置为true,但我很难做到这一点。我在youtube上观看了多个关于android studio单元测试的视频,并通读了这里所有涉及使用android studio进行firebase单元测试的帖子,但我仍然无法执行我想要的测试

因为我的研究已经把我带到了死胡同,我希望这里的人能给我发送一些我还没有看到的示例代码,或者更好的是帮助我编写我想要的测试

我尝试测试的代码在此类中:

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);
}
公共类请求扩展了AppCompatActivity{
私有静态最终字符串TAG=“Request”;
//火基材料
Firebase数据库;
数据库引用开始,ref;
数据库参考用户;
RecyclerView recycler_菜单;
RecyclerView.LayoutManager LayoutManager;
对话与对话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u请求);
最终字符串passedEmail=getIntent().getStringExtra(“电子邮件”);
//Init Firebase
database=FirebaseDatabase.getInstance();
start=database.getReference(“事务”);
ref=database.getReference(“用户”);
//加载菜单
回收商菜单=findViewById(R.id.recycler\u菜单);
recycler_菜单。setHasFixedSize(真);
layoutManager=新的LinearLayoutManager(此);
回收器菜单。设置布局管理器(布局管理器);
loadMenu();
}
私有void加载菜单(){
FirebaseRecyclerAdapter=新的FirebaseRecyclerAdapter(Transaction.class、R.layout.trans_项、TransRequestHolder.class、start){
@凌驾
受保护的void populateViewHolder(TransRequestHolder viewHolder,最终事务模型,int位置){
最终字符串passedUserType=getIntent().getStringExtra(“用户类型”);
最终字符串passedEmail=getIntent().getStringExtra(“电子邮件”);
最终字符串接收器=model.getReceiver().replace('.','');
最后一个字符串shopA=model.getShopA().replace('.','');
//卡斯特
if(passedEmail.equalsIgnoreCase(model.getReceiver())和&model.getCustflag()==false){
viewHolder.txtransactiona.setText(model.getAmount());
viewHolder.txtTransactionC.setText(model.getCurrency());
viewHolder.txtTransactionR.setText(model.getReceiver());
最终交易点击项目=模型;
viewHolder.setItemClickListener(新建ItemClickListener(){
@凌驾
public void onClick(android.view.view视图,int位置,布尔值isLongClick){
Toast.makeText(Request.this,“Receiving:+shopA,Toast.LENGTH_SHORT).show();
最后一个字符串key=model.getKey();
custDialog=新建对话框(Request.this);
custDialog.setContentView(R.layout.dialog_模板);
final-EditText-Write=custDialog.findViewById((R.id.Write));
按钮批准=custDialog.findViewById(R.id.Approve);
Write.setEnabled(true);
Approve.setEnabled(true);
Approve.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串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();
}
});
}
//肖帕
else if(passedEmail.equalsIgnoreCase(model.getShopA())&&&(model.getCustflag()==true&&model.getShopAflag()==false)){
viewHolder.txtransactiona.setText(model.getAmount());
viewHolder.txtTransactionC.setText(model.getCurrency());
viewHolder.txtTransactionR.setText(model.getReceiver());
最终交易点击项目=模型;
viewHolder.setItemClickListener(新建ItemClickListener(){
@凌驾
public void onClick(android.view.view视图,int位置,布尔值isLongClick){
Toast.makeText(Request.this,“Receiving:+shopA,Toast.LENGTH_SHORT).show();
最后一个字符串key=model.getKey();
//对话框选项一
customDialog(“交易批准”、“您确定要批准此交易吗?”、“取消”、“确定方法2”、PasseMail、密钥);
}
});
}
//小店
else if(passedEmail.equalsIgnoreCase(model.getShopB())&&&(model.getShopAflag()==true&&model.getShopBflag()==false)){
viewHolder.txtTransactionA.setText(mo