在Android中使用虚假的http响应测试活动

时间:2015-12-11 16:20:36

标签: android testing android-async-http

我有一个注册活动。活动接受用户的个人资料,如电子邮件和密码,然后将这些值上传到服务器。服务器将成功后将这些值返回给Activity,以便将活动保存到SharedPreferences。
我的问题是,如何编写一个返回虚假响应的测试,以便Activity不必与真实服务器交互,并检查这些值是否已完全保存到首选项中?

这是我的活动:

public class RegisterActivity extends AppCompatActivity implements RegisterRestClientUsage.RegisterCallback{
    private RegisterRestClientUsage registerRestClientUsage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        registerRestClientUsage = new RegisterRestClientUsage(this);
        //...
    }
    public void onClick(View view){
        String email = emailEditText.getText().toString();
        String password = passwordEditText.getText().toString();
        registerRestClientUsage.registerToServer(email,password);
    }
    @Override
    public void registerSuccess(String token, String email) {

        //Save those values to SharedPreferences

        finish();
    }

    @Override
    public void registerFail() {
        finish();
    }
}

RegisterClientUsage.class

public class RegisterRestClientUsage {
    private RegisterCallback callback;
    public interface RegisterCallback{
        void registerSuccess(String token,String email);
        void registerFail();
    }

    public RegisterRestClientUsage(RegisterCallback r){
        callback = r;
    }
    public void registerToServer(String email,String password){
            RequestParams params = new RequestParams();
            params.put("email", email);
            params.put("password", password);

            BaseRestClient.post("api/users/sign_up", params, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    try {
                        JSONObject responseJson = new JSONObject(new String(responseBody));
                        returnToken = responseJson.optString("token");
                        JSONObject userJson = responseJson.optJSONObject("user");
                        returnEmail = userJson.optString("email");
                        callback.registerSuccess(returnToken,returnEmail);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                    callback.registerFail();
                }
            });
    }
}  

BaseRestClient.class

public class BaseRestClient {
    public static final String BASE_URL =  "https://my.api.com/";
    private static AsyncHttpClient client = new AsyncHttpClient();

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }

}

由于RegisterRestClientUsage嵌入在RegisterActivity中,我找不到将假服务器注入Activity的好方法。

1 个答案:

答案 0 :(得分:1)

感谢@ geek90的帮助,我终于提出了一个解决方案。我只是用另一个控制器(RegisterRestClientUsage.class)包装我真正的api实现(RegisterController.class):

public class RegisterController{

    private RegisterServer serverSide;

    public RegisterController(RegisterServer r){
        serverSide = r;
    }

    public void registerToServer(String email,String password) {
        RequestParams params = new RequestParams();
        params.put("email", email);
        params.put("password", password);
        serverSide.registerToServer(params);
    }
} 

RegisterRestClientUsage.class实现RegisterServer接口:

public interface RegisterServer{
    void registerToServer(String email,String  pwd);
}

onCreate()的{​​{1}}方法中,使用参数RegisterActivity构建控制器

RegisterRestClientUsage

在这种情况下,我可以将我伪造的api实现存入控制器进行测试:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    registerController = new RegisterController(new RegisterRestClientUsage(this));
    //...
}