繁体   English   中英

如何对在 AndroidViewModel class 内部进行 retrofit 调用的方法进行单元测试?

[英]How can I do unit testing of a method which is making retrofit call inside of AndroidViewModel class?

我想通过调用 retrofit 为执行注册的方法编写单元测试,并且该方法位于 AndroidViewModel class 内部。我该如何测试此方法?

public class SignUpViewModel extends AndroidViewModel {
    private final Context context;
    private LoadToast loadToast;

    public SignUpViewModel(@NonNull Application application, Context context) {
        super(application);
        this.context = context;
    }


    public void signUpRequest(final String userName, String userPassword, String userEmail, String firstName, String lastName, String securityQuestion, String securityAnswer) {
        JSONObject jsonObject = new JSONObject();
        JSONObject securityJsonObject = new JSONObject();
        loadToast = new LoadToast(context);
        loadToast.setText("Signing in");
        loadToast.show();
        try {

            jsonObject.put("identifier", userName);
            jsonObject.put("password", userPassword);
            jsonObject.put("email", userEmail);
            jsonObject.put("firstName", firstName);
            jsonObject.put("lastName", lastName);
            securityJsonObject.put("question", securityQuestion);
            securityJsonObject.put("answer", securityAnswer);
            jsonObject.put("securityQuestion",securityJsonObject);

        } catch (JSONException e) {
            e.printStackTrace();
        }

        APIService apiService = RetrofitClient.getAPIService();
        Call<String> signUpResponse = apiService.createUser(jsonObject.toString());
        signUpResponse.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                if (response.message().equals("timeout")) {
                    loadToast.error();
                    Toast.makeText(getApplication(), "Network Connection issues please try again", Toast.LENGTH_LONG).show();
                }
                if (response.code() == 200) {
                    loadToast.success();
                    Toast.makeText(getApplication(), "An activation link has been sent to your email. Follow it to activate your account.", Toast.LENGTH_LONG).show();
                    context.startActivity(new Intent(context, LogInActivity.class));
                } else if (response.code() == 409) {
                    loadToast.error();
                    Toast.makeText(getApplication(), "User With Same UserName already Exists", Toast.LENGTH_LONG).show();
                } else {
                    loadToast.error();
                    Toast.makeText(getApplication(), "Something went wrong please try again", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                loadToast.error();
                Toast.makeText(getApplication(), "" + t.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });
    }


}

我的 class 看起来像这样,我想测试signUpRequest方法。 我阅读了一些教程,但它们没有帮助。 那么,我该如何编写单元测试来测试我的方法呢?

根据清洁架构方法,您的 ViewModel 代码必须不包含任何与框架相关的代码。 尤其是上下文。 您对 retrofit 所做的所有这些工作都必须移到另一层。 在 UseCase 或 Interactor 中移动此代码并使用 Repository 模式。 此链接可能会有所帮助: https://proandroiddev.com/how-to-implement-a-clean-architecture-on-android-2e5e8c8e81fe

良好的架构将使您的代码可测试。 希望它会有所帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM