`createActivity`和`shadowOf`有什么区别?

时间:2015-12-03 13:16:37

标签: java android unit-testing robolectric

我看到了这个roboletirc示例:

 @Test
  public void shouldHaveHappySmiles() throws Exception {
    String hello = new MainActivity().getResources().getString(R.string.hello_world);
    assertThat(hello, equalTo("Hello world!"));
  }

  @Before
  public void setup()  {
    activity = Robolectric.buildActivity(MainActivity.class)
        .create().get();
  }
  @Test
  public void checkActivityNotNull() throws Exception {
    assertNotNull(activity);
  }

  @Test
  public void buttonClickShouldStartNewActivity() throws Exception 
  {
      Button button = (Button) activity.findViewById(R.id.button2);
      button.performClick();
          Intent intent = Robolectric.shadowOf(activity).peekNextStartedActivity();
          assertEquals(SecondActivity.class.getCanonicalName(), inten

t.getComponent().getClassName());
  }

我试着查看文档,但没有理解createActivityshadowOf之间的区别。有人可以请一些亮点吗?

顺便问一下,为什么这个测试中有new MainActivity().getResources().getString(R.string.hello_world);?我应该何时使用new代替createActivity()

1 个答案:

答案 0 :(得分:0)

Shadows在测试时为实际类提供替代功能。它们有时也会提供它们阴影类中没有的功能,这样您就可以打开和关闭功能,并检查被镜像对象的内部值。

例如:关闭测试类中的Google Analytics(分析)

ShadowApplication shadowApplication =
   Robolectric.shadowOf_(Robolectric.application);   shadowApplication.declareActionUnbindable( “com.google.android.gms.analytics.service.START”);

关于阴影: http://robolectric.org/extending/

不要使用“新”使用buildActivity。这使您可以完全控制Activity生命周期,以便在启动周期的每个步骤之后检查Activity上的内容。例如,您可以在不调用onResume的情况下调用get()。

activitySome = 
Robolectric.buildActivity(SomeActivity.class).withIntent(intent).create().start().resume().visible().get();

在buildActivity上调用.get()之后,可以在活动类上调用getResources()。