Android:测试改造成功,失败

时间:2014-12-22 13:15:00

标签: java android unit-testing junit

我是Android测试新手。我现在尝试的只是使用Junit4的新Espresso。到目前为止,Espresso适用于ui测试,使用junit我们可以进行逻辑测试。所以我正在尝试使用Junit来测试我的改进代码

protected String signIn(String emailNumber, String password) {

    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Constants.API_URL).build();
    RetroInterface retroInterface = restAdapter.create(RetroInterface.class);

    retroInterface.signIn(emailNumber, password, new Callback<SignInPojo>() {
        @Override
        public void success(SignInPojo signInPojo, Response response) {
            if (signInPojo.getError()) {
                Snackbar.with(getApplicationContext()).text(signInPojo.getMessage())
                        .textColor(getResources().getColor(R.color.red_400)).show(SignInActivity.this);
                result = "successerror";

            } else {
                Log.d("Json", signInPojo.getName());
                result = "Successfully Signed In";
                editor = sharedPreferences.edit();
                editor.putBoolean(Constants.IS_LOGGED_IN, true);
                editor.apply();
                startActivity(new Intent(getApplicationContext(), LenderActivity.class));
                finish();
            }
        }

        @Override
        public void failure(RetrofitError error) {
            Log.d("RetroError", error.toString());
            Log.d("RetroUrl", error.getUrl());
            result = "failed";
        }
    });
    return result;
}

使用这些测试类: 的 SignInActivityJunit.java

import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.SmallTest;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class SignInActivityJunit extends ActivityInstrumentationTestCase2<SignInActivity>{
    private SignInActivity signInActivity;

    public SignInActivityJunit() {
        super(SignInActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        signInActivity = getActivity();
    }

    @Test
    public void checkSignIn_Success() {
        String result = signInActivity.signIn("99929992", "aaaaaaaa");
        assertThat(result, is(equalTo("success")));
    }@Test
    public void checkSignIn_SuccessButError() {
        String result = signInActivity.signIn("99929992", "aaaaaaaa");
        assertThat(result, is(equalTo("successerror")));
    }@Test
    public void checkSignIn_Fail() {
        String result = signInActivity.signIn("99929992", "aaaaaaaa");
        assertThat(result, is(equalTo("success")));
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }
}

现在这些情况都失败了,因为在调试时我发现他们没有等待网络返回呼叫(根据我的猜测)。他们正在跳过成功失败方法。 所以问题是..如何使单元测试等到改造返回请求。或者是否有任何其他有效的方法来测试这些网络连接。 谢谢

1 个答案:

答案 0 :(得分:0)

这不会回答你的问题,但我认为更正确的测试网络服务的方法是模拟服务器和请求,或用浓咖啡实际测试用户界面。

在第一种情况下,使用jUnit,您不会创建实际请求,而是会返回预定义结果的模拟请求(结果可以从文件中读取)。在这里,您可以测试对模型类的响应转换是否成功,如果有的话。

在第二种情况下,使用Espresso,测试设备上的实际内容,例如打开LoginActivity - &gt;检索登录/用户名字段 - &gt;输入文字 - &gt;单击“登录”按钮。正如预期的结果,您可以在主要活动中设置一些控件(在成功登录后重定向您的控件)