Я использую Mockito
и Spy для модульного тестирования функции.
Это тестируемый класс:
public class RecipeListModelImp
implements RecipeListModelContract {
private Subscription subscription;
private RecipesAPI recipesAPI;
@Inject
public RecipeListModelImp(@NonNull RecipesAPI recipesAPI) {
this.recipesAPI = Preconditions.checkNotNull(recipesAPI);
}
@Override
public void getRecipesFromAPI(final RecipeGetAllListener recipeGetAllListener) {
subscription = recipesAPI.getAllRecipes()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Recipe>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
recipeGetAllListener.onRecipeGetAllFailure(e.getMessage());
}
@Override
public void onNext(List<Recipe> recipe) { recipeGetAllListener.onRecipeGetAllSuccess(recipe);
}
});
}
@Override
public void shutdown() {
if(subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
}
Я пытаюсь протестировать с помощью Mockito и шпиона, так как я не хочу вызывать настоящую функцию recipesAPI.getAllRecipes()
, просто проверьте ее. Тест называется testGetRecipesFromAPI()
public class RecipeListModelImpTest {
@Mock Subscription subscription;
@Mock RecipesAPI recipesAPI;
@Mock RecipeListModelContract.RecipeGetAllListener recipeGetAllListener;
private RecipeListModelContract recipeListModel;
@Before
public void setup() {
MockitoAnnotations.initMocks(RecipeListModelImpTest.this);
recipeListModel = new RecipeListModelImp(recipesAPI);
}
@Test
public void testGetRecipesFromAPI() {
RecipeListModelContract recipeListModelSpy = spy(recipeListModel);
RecipesAPI recipeApiSpy = spy(recipesAPI);
doNothing().when(recipeApiSpy).getAllRecipes();
recipeListModelSpy.getRecipesFromAPI(recipeGetAllListener);
verify(recipesAPI, times(1)).getAllRecipes();
}
@Test
public void testShouldShutdown() {
recipeListModel.shutdown();
verify(subscription, times(1)).unsubscribe();
}
}
Это ошибка:
org.mockito.exceptions.base.MockitoException:
Only void methods can doNothing()!
Example of correct use of doNothing():
doNothing().
doThrow(new RuntimeException())
.when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
Я также пробовал это, что вызывает нулевой указатель:
@Test
public void testGetRecipesFromAPI() {
RecipeListModelContract recipeListModelSpy = spy(recipeListModel);
RecipesAPI recipeApiSpy = spy(recipesAPI);
doReturn(Observable.just(Subscription.class)).when(recipeApiSpy).getAllRecipes();
recipeListModelSpy.getRecipesFromAPI(recipeGetAllListener);
verify(recipesAPI, times(1)).getAllRecipes();
}