Задать вопрос
SanchelliosProg
@SanchelliosProg
Java, Android, Software Testing

Как создать mock базы данных используя Mockito?

Всем привет!
Решил потихоньку покрыть юнит тестами моё приложение под Android, пора-пора. Но вот столкнулся с проблемой:
java.lang.NullPointerException
at com.projects.sanchellios.slovo.MockDatabaseConstructor.insertWordIntoDatabase(MockDatabaseConstructor.java:64)

и так-далее.

Замысел был таков, что я хотел создать Mock базы данных:
@RunWith(MockitoJUnitRunner.class)
public class MockDatabaseConstructor {
    @Mock
    private SQLiteDatabase database;
    @Mock
    private DatabaseHelper databaseHelper;
    public static String LESS_THAN_15 = "LESS_THAN_15";
    public static String MORE_THAN_15 = "MORE_THAN_15";

    public MockDatabaseConstructor(Context context, String fillDbScenarioCommand){
        databaseHelper = DatabaseHelper.getInstance(context);
        database = databaseHelper.getWritableDb();
        if(fillDbScenarioCommand.equals(LESS_THAN_15)){
            createLessThan15WordsInDb();
        }else if(fillDbScenarioCommand.equals(MORE_THAN_15)){
            createMoreThan15WordsInDb();
        }
    }

    private void createLessThan15WordsInDb(){
        insertWordIntoDatabase("good", "добро, хорошо", 10, 1); //score=10
        insertWordIntoDatabase("evil", "зло", 8, 2);            //score=4
        insertWordIntoDatabase("mock", "макет, ложный", 5, 5);  //score=1
    }
    private void createMoreThan15WordsInDb(){
        insertWordIntoDatabase("good", "добро, хорошо", 10, 1); //score=10
        insertWordIntoDatabase("evil", "зло", 8, 2);            //score=4
        insertWordIntoDatabase("mock", "макет, ложный", 5, 5);  //score=1
    }

    private void insertWordIntoDatabase(String wordValue,
                                        String translations,
                                        int correctAnswers,
                                        int incorrectAnswers){
        double score = getScore(correctAnswers, incorrectAnswers);
        ContentValues translatedWordValues = new ContentValues();
        translatedWordValues.put(WORD_COL, wordValue);
        translatedWordValues.put(TRANSLATIONS_COL, translations);
        translatedWordValues.put(CORRECT_COL, correctAnswers);
        translatedWordValues.put(INCORRECT_COL, incorrectAnswers);
        translatedWordValues.put(SCORE_COLUMN, score);
        database.insert(TRANSLATED_WORDS_TABLE, null, translatedWordValues);
    }

    private double getScore(int correct, int incorrect){
        return (double)correct/(double)incorrect;
    }

    public SQLiteDatabase getDatabase(){
        return this.database;
    }
}


Который бы мог быть вызван тестами:
@RunWith(MockitoJUnitRunner.class)
public class QuizTest {
    private final int TEST_LIMIT = 15;
    private MockDatabaseConstructor mockDatabase;
    private SQLiteDatabase database;
    private Quiz quiz;
    @Mock
    Context mockContext;

    @Before
    public void setUp() {

        mockDatabase = new MockDatabaseConstructor(mockContext, MockDatabaseConstructor.LESS_THAN_15);
        database = mockDatabase.getDatabase();
        quiz = new Quiz(mockContext, TEST_LIMIT);
    }

    @Test
    public void TestFirstWordPoll() {
        Word word = quiz.pollNextWord();
        assertEquals("Wrong word at the beginning of queue", "good", word.getWordValue());
    }
}

Но получается вот такая вот петрушка в виде NullPointerException. Собственно вопрос: "А как замокать базу данных, чтобы всё прошло окей?"
  • Вопрос задан
  • 915 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы