Използвам 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();
}