我有一个注册活动。活动接受用户的个人资料,如电子邮件和密码,然后将这些值上传到服务器。服务器将成功后将这些值返回给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的好方法。
答案 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));
//...
}