Java 如何对在AndroidViewModel类内部进行改装调用的方法进行单元测试?

Java 如何对在AndroidViewModel类内部进行改装调用的方法进行单元测试?,java,android,unit-testing,retrofit2,android-viewmodel,Java,Android,Unit Testing,Retrofit2,Android Viewmodel,我想为一个方法编写一个单元测试,该方法通过进行改装调用来执行注册,并且该方法位于AndroidViewModel类中。如何测试该方法 public class SignUpViewModel extends AndroidViewModel { private final Context context; private LoadToast loadToast; public SignUpViewModel(@NonNull Application applicatio

我想为一个方法编写一个单元测试,该方法通过进行改装调用来执行注册,并且该方法位于AndroidViewModel类中。如何测试该方法

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();

            }
        });
    }


}
公共类SignUpViewModel扩展了AndroidViewModel{
私人最终语境;
私人面包片;
public SignUpViewModel(@NonNull应用程序,上下文){
超级(应用);
this.context=上下文;
}
public void signUpRequest(最终字符串用户名、字符串用户密码、字符串用户电子邮件、字符串firstName、字符串lastName、字符串securityQuestion、字符串securityAnswer){
JSONObject JSONObject=新的JSONObject();
JSONObject securityJsonObject=新JSONObject();
loadToast=新的loadToast(上下文);
loadToast.setText(“登录”);
loadToast.show();
试一试{
jsonObject.put(“标识符”,用户名);
jsonObject.put(“密码”,userPassword);
jsonObject.put(“email”,userEmail);
jsonObject.put(“firstName”,firstName);
jsonObject.put(“lastName”,lastName);
securityJsonObject.put(“问题”,securityQuestion);
securityJsonObject.put(“应答”,securityAnswer);
put(“securityQuestion”,securityJsonObject);
}捕获(JSONException e){
e、 printStackTrace();
}
APIService APIService=reformationclient.getAPIService();
调用signUpResponse=apiService.createUser(jsonObject.toString());
signUpResponse.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.message()等于(“超时”){
loadToast.error();
Toast.makeText(getApplication(),“网络连接问题,请重试”,Toast.LENGTH_LONG.show();
}
if(response.code()==200){
loadToast.success();
Toast.makeText(getApplication(),“已将激活链接发送到您的电子邮件。请按照此链接激活您的帐户。”,Toast.LENGTH_LONG).show();
新意图(context,LogInActivity.class));
}else if(response.code()==409){
loadToast.error();
Toast.makeText(getApplication(),“已存在具有相同用户名的用户”,Toast.LENGTH_LONG.show();
}否则{
loadToast.error();
Toast.makeText(getApplication(),“出现问题,请重试”,Toast.LENGTH_LONG.show();
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
loadToast.error();
Toast.makeText(getApplication(),“”+t.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
}

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

根据干净的体系结构方法,您的ViewModel代码不必包含任何与框架相关的代码。尤其是上下文。所有这些改造工作都必须转移到另一层。在UseCase或Interactor中移动此代码并使用存储库模式。此链接可能会有所帮助:

良好的体系结构将使您的代码可测试。
希望它能有所帮助:)

你需要在你的
SignUpViewModel
构造函数中注入你的改造依赖项,这样你就可以模拟它的结果,并能够进行单元测试。我是单元测试新手,我正在学习它,有没有真正有用的例子。