Dodano @VisibleForTesting
i chroniony. Mój test może teraz ta metoda:Testowanie klasy Fragment w izolacji za pomocą Mockito
@VisibleForTesting
protected void setupDataBinding(List<Recipe> recipeList) {
recipeAdapter = new RecipeAdapter(recipeList);
RecyclerView.LayoutManager layoutManager
= new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
rvRecipeList.setLayoutManager(layoutManager);
rvRecipeList.setAdapter(recipeAdapter);
}
Updated przypadek testowy przy użyciu obiekt szpiegowski: Jednak prawdziwym setupDataBinding (przepis) nazywana jest uzyskiwanie nawet kiedy stworzyliśmy makietę He szpiegować, że będzie się nazywa. Może robię to źle.
@Test
public void testShouldGetAllRecipes() {
RecipeListView spy = Mockito.spy(fragment);
doNothing().when(spy).setupDataBinding(recipe);
fragment.displayRecipeData(recipe);
verify(recipeItemClickListener, times(1)).onRecipeItemClick();
}
Próbuję przetestować metody w mojej klasie Fragment
, jak poniżej. Próbuję jednak wyśmiewać metody sprawdzania, czy metody są nazywane odpowiednią liczbą razy. Jednak problem polega na tym, że mam ustawienia private
, które są konfigurowane na RecyclerView
, które są wywoływane z displayRecipeData(...)
. Chcę udawać te połączenia, ponieważ nie chcę wywoływać prawdziwego obiektu na RecyclerView
. Chcę tylko sprawdzić, czy zostanie wywołana setupDataBinding(...)
.
Próbowałem używać szpiega i VisibleForTesting
, ale wciąż nie jestem pewien, jak to zrobić.
Próbuję przetestować Fragment w izolacji.
public class RecipeListView
extends MvpFragment<RecipeListViewContract, RecipeListPresenterImp>
implements RecipeListViewContract {
@VisibleForTesting
private void setupDataBinding(List<Recipe> recipeList) {
recipeAdapter = new RecipeAdapter(recipeList);
RecyclerView.LayoutManager layoutManager
= new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
rvRecipeList.setLayoutManager(layoutManager);
rvRecipeList.setAdapter(recipeAdapter);
}
@Override
public void displayRecipeData(List<Recipe> recipeList) {
/* Verify this get called only once */
setupDataBinding(recipeList);
recipeItemListener.onRecipeItem();
}
}
Tak właśnie testuję. Dodałem myślenie VisibleForTesting
, które mogłem pomóc. Próbowałem też użyć szpiega.
public class RecipeListViewTest {
private RecipeListView fragment;
@Mock RecipeListPresenterContract presenter;
@Mock RecipeItemListener recipeItemListener;
@Mock List<Recipe> recipe;
@Before
public void setup() {
MockitoAnnotations.initMocks(RecipeListViewTest.this);
fragment = RecipeListView.newInstance();
}
@Test
public void testShouldGetAllRecipes() {
fragment.displayRecipeData(recipe);
RecipeListView spy = Mockito.spy(fragment);
verify(recipeItemListener, times(1)).onRecipeItem();
}
}
Jaki byłby najlepszy sposób, aby przetestować powyższe w izolacji?
Wielkie dzięki za radę.
Dodawanie '@ VisibleForTesting' nie wystarczy. Musisz również zmienić modyfikator dostępu dla 'setupDataBinding (...)' na chroniony, pakiet prywatny lub publiczny. – liminal
@liminal Zaktualizowałem moje pytanie z moimi ostatnimi uwagami. Nie mogę zapobiec wywołaniu prawdziwej metody bing, mimo że stworzyłem jej obiekt szpiegowski. – ant2009