2015-12-15 11 views
6

Ich erstelle und Android-Anwendung. Ich benutze Espresso zum Testen.Aufruf einer Methode der getesteten Aktivität von einem Test mit Espresso und sehen Sie die Ergebnisse

Ich habe eine Aktivität mit der Methode:

public void render(Recipe recipe){ 
    //draw the recipe to the activity 
} 

ich testen wollen, dass diese Methode richtig funktioniert.

arbeiten Nicht-Lösung 1

ich folgende

@Test 
public void viewPaintsRecipes() { 
    final Activity activity = activityRule.launchActivity(new Intent()); 
    ((MainActivity)activity).render(Arrays.asList(new Recipe[]{recipe})); 
    onView(withId(R.id.text)).check(matches(withText(recipe.toString()))); 
} 

ich eine Ausnahme erhalten getestet haben.

Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.

arbeiten Nicht-Lösung 2

Ich habe auch von einem Handler in dem Haupt-Thread, aber der Test hängt die beiden Linien in einem runnable runned zu setzen versucht.

Wie kann ich das erreichen?

Hinweise

Ich lege den gesamten Test. Beachte, dass ich auch Dolch und Mockito benutze.

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MainActivityTestWithMockPresenter { 
    Recipe recipe = new Recipe("sampleTitle"); 
    @Rule 
    public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule(MainActivity.class, true, false); 

    @Mock 
    MainActivityPresenter mockPresenter; 
    @Mock 
    AndroidApplication mockContext; 

    @Before 
    public void insertMockedComponent(){ 
     MockitoAnnotations.initMocks(this); 
     Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 
     AndroidApplication app = (AndroidApplication) instrumentation.getTargetContext().getApplicationContext(); 
     MyModule mockedMyModule = new MyModule(mockContext){ 
      @Provides 
      public MainActivityPresenter getMainActivityPresenter(){ 
       return mockPresenter; 
      } 
     }; 
     MyComponent component = DaggerMyComponent.builder().myModule(mockedMyModule).build(); 
     app.setComponent(component); 
    } 

    @Test 
    public void viewPaintsRecipes() { 
     final Activity activity = activityRule.launchActivity(new Intent()); 
     ((MainActivity)activity).render(Arrays.asList(new Recipe[]{recipe})); 
     onView(withId(R.id.text)).check(matches(withText(recipe.toString()))); 
    } 
} 

Dank

+0

löschen @ Mock Annotationen und sagen, wie es dann – piotrek1543

+0

Ihre Mischung funktionieren würde Ing Unit Tests mit automatisierten Tests – piotrek1543

+0

@ piotrek1543 Ich möchte die Mocks verwenden, weil ich nur die Aktivität testen möchte, nicht alle Ebenen (Presenter, Use Cases, etc). Wenn dies nicht der Fall ist, wie kann ich Activity-Methoden auf eine isolierte Art und Weise testen? – Mateu

Antwort

7

Ich habe es geschafft, das mit diesen Abhängigkeiten in meiner build.gradle Datei zur Arbeit zu kommen:

androidTestCompile 'com.android.support:support-annotations:23.1.0' 
androidTestCompile 'com.android.support.test:runner:0.4.1' 
androidTestCompile 'com.android.support.test:rules:0.4.1' 
androidTestCompile 'org.hamcrest:hamcrest-library:1.3' 
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' 

Sie benötigen die ActivityTestRule.runOnUiThread(@NotNull java.lang.Runnable runnable) Methode wie folgt zu verwenden:

@Test 
public void testRecipeRender() throws Throwable { 
    // When. 
    activityTestRule.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      activityTestRule.getActivity().render(someRecipe); 
     } 
    }); 

    // Then. 
    // assert stuff about the recipe rendering here 
}