Хорошо, я придумал следующее решение. Странно, что я никогда не видел подобных примеров на их странице или в статьях. Я использовал Mockito вместе с Robolectric .
Во-первых, я добавил метод setPresenter
в Activity (представление MVP) для вставки пользовательского макета Presenter в представление
@VisibleForTesting
public void setPresenter(P presenter) {
this.presenter = presenter;
}
В моем коде Presenter создается во время метода onCreate (), поэтому я добавил null-check , чтобы добавить Presenter до onCreate () :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (presenter == null)
presenter = providePresenter(App.appComponentFrom(this));
presenter.create();
}
В Robolectric Framework я нашел метод buildActivity()
, который просто вызывает конструктор Activity (никаких методов жизненного цикла!).
Затем, после этого звонка, я сделал инъекцию своему ведущему.
Последний шаг - вызов activityController.setup().get()
, как и тот же, что и setupActivity()
, который вызывает методы жизненного цикла: create(), resume()
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class MainActivityTest {
@Mock
CheckoutContract.Presenter presenter;
private ShadowActivity mainActivity;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
ActivityController<MainActivity> activityController = Robolectric.buildActivity(MainActivity.class);
activityController.get().setPresenter(presenter);
mainActivity = Shadows.shadowOf(activityController.setup().get());
}
@Test
public void checkText() throws Exception {
assertEquals(RuntimeEnvironment.application.getString(R.string.activityMain_title),
((Toolbar)checkoutActivity.findViewById(R.id.vToolbar)).getTitle());
}
}
Вуаля! В моем тесте я получил ресурсы контекста от RuntimeEnvironment
и он прошел!