如何使用Mockito和Robolectric来模拟Context?

时间:2012-05-23 17:02:58

标签: android unit-testing mockito robolectric

这是我活动的片段:

public class Search extends Activity
{
    private String TAG = "SEARCH";

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);
        Log.d(TAG, "About to call initialastion");
   //        new InitialisationTask(this).execute();
    }
}

通过上面注释的行,我可以愉快地创建和执行单元测试,如下所示:

@RunWith(RobolectricTestRunner.class)
public class SearchTest {
    private Search searchActivity;
    private Button searchButton;
    private Button clearButton;
    private Button loginButton;
    private Button registerButton;
    private EditText searchEditText;

    @Before
    public void setUp() throws Exception {
        searchActivity = new Search();
        searchActivity.onCreate(null);

        searchButton = (Button) searchActivity.findViewById(R.id.btnPlateSearch);
        clearButton = (Button) searchActivity.findViewById(R.id.btnClearSearch);
        loginButton = (Button) searchActivity.findViewById(R.id.btnLogin);
        registerButton = (Button) searchActivity.findViewById(R.id.btnRegister);
        searchEditText = (EditText) searchActivity.findViewById(R.id.editTextInputPlate);
    }


    @Test
    public void assertSearchButtonHasCorrectLabel()
    {
        assertThat((String) searchButton.getText(), equalTo("Search"));
    }
}

但是,如果我在活动中取消注释行new InitialisationTask(this).execute();,我的测试就会失败,很可能是因为对this的引用。

模仿上下文的最佳方法是什么?

我已尝试将contextMock = mock(Context.class);添加到我的setUp()但是我不确定如何将此模拟“设置为”searchActivity

由于

3 个答案:

答案 0 :(得分:12)

对于robolectric 3.0,要获取Context对象,只需使用:

RuntimeEnvironment.application.getApplicationContext();

在上面的代码中,您不必显式创建活动对象并将其称为onCreate()方法。 Robolectric可以使用以下方式为您设置活动:

searchActivity = Robolectric.setupActivity(SearchTest.class);

答案 1 :(得分:4)

要获取活动或应用程序的上下文,您可以使用:

Robolectric.getShadowApplication().getApplicationContext();

例如:

Context context = Robolectric.getShadowApplication().getApplicationContext();

现在使用上下文变量。

答案 2 :(得分:3)

我正在使用Robolectric 3.2。这是我用过的:

ShadowApplication.getInstance().getApplicationContext();