2016-10-03 2 views
0

У меня есть кнопка в моем приложении, и когда пользователь нажимает на i, он отображает текст. Теперь я хочу протестировать его с помощью Espresso.Тест с эспрессо и насмешливый dataSource сбой

Код в MainActivity является:

public void onButtonGetDataClick(View view) { 
    mainPresenter.onButtonClick(); 
} 

@Override 
public void showData(String data) { 
    textView.setText(data); 
} 

и mainPresenter.onButtonClick():

@Override 
public void onButtonClick() { 
    if (dataSource != null) { 
     mainView.showData(dataSource.getReleaseString()); 
    } 
} 

, где dataSource вводится в MainPresenter.

Проблема в том, как я могу проверить такую ​​вещь? Я попытался насмешливо dataSource и проверить это нравится:

@Test 
public void onButtonGetDataClicked_textViewDisplaysData() { 
    when(dataSource.getReleaseString()).thenReturn(MOCK_STRING); 

    activityRule.launchActivity(new Intent()); 

    /** Click Button*/ 
    onView(withId(R.id.btn_get_data)) 
      .perform(click()); 

    onView(withId(R.id.tv_text_data)) 
      .check(matches(withText(MOCK_STRING))); 

} 

, но это всегда дает мне "RELEASE_STRING", а не "MOCK_STRING" поэтому тест всегда терпит неудачу

Edit: код впрыска:

@Before 
public void setUp() { 

    mockMainView = mock(MainMVP.View.class); 
    mainPresenter = new MainPresenter(mockMainView); 

    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 
    MockMyApplication applicationContext 
      = (MockMyApplication) instrumentation.getTargetContext().getApplicationContext(); 
    MockDataComponent component = (MockDataComponent) applicationContext.component(); 
    component.inject(mainPresenter); 

} 

и, конечно, я использую

@Inject 
DataSource dataSource; 

MockDataComponent:

@Singleton 
@Component(modules = {MockDataModule.class}) 
public interface MockDataComponent extends DemoComponent { 

void inject(MainPresenter mainPresenter); 

} 

и MockDataModule:

@Module 
public class MockDataModule { 

@Provides 
public DataSource providesDataSource() { 
    return mock(DataSource.class); 
} 

} 
+0

Можете ли вы опубликовать код инъекции источника данных? Используете ли вы кинжал для инъекций зависимостей? – Niko

+0

Как насчет модуля MockDataComponent? – Niko

+0

@Niko добавил также 'MockDataComponent' и' MockDataModule'. – Mes

ответ

1

Вы не устанавливая выступающему для Activity здесь так издеваться DataSource не могут быть доступны.

С помощью компонента Presenter вы можете вводить презентатор для своей деятельности, и этот сингл-презентатор может иметь источник данных, который должен присутствовать.