【问题标题】:how can I mock the Context using Mockito and Robolectric?如何使用 Mockito 和 Robolectric 模拟上下文?
【发布时间】:2012-05-30 06:40:16
【问题描述】:

这是我的活动记录:

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

谢谢

【问题讨论】:

  • 你能分享你的任务代码吗?

标签: android unit-testing mockito robolectric


【解决方案1】:

要获取 Activity 或 Application 的上下文,您可以使用:

Robolectric.getShadowApplication().getApplicationContext();

例如:

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

现在使用上下文变量。

【讨论】:

  • 请注意,这是 Robolectric 2.x 及更早版本的答案。
【解决方案2】:

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

RuntimeEnvironment.application.getApplicationContext();

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

searchActivity = Robolectric.setupActivity(SearchTest.class);

【讨论】:

    【解决方案3】:

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

    ShadowApplication.getInstance().getApplicationContext();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多