Проверка между нажатием клавиши и событием нажатия клавиши

Есть ли возможность запустить тест между обработчиками событий нажатия клавиши и нажатия клавиши приложения? Я разрабатываю аркадную 2D-игру, gameThread внутри gameView обрабатывает нажатия клавиш. Я написал JUnit Android Testing Project. Я читал об this.sendKeys(), но кажется, что этот метод отправляет ключ вверх, а затем вниз сигналы.

ДЕТАЛИ: я буду использовать как сенсорное, так и не сенсорное взаимодействие. Но сейчас я тестирую

не сенсорный. Поэтому я написал:

`protected void setUp() выдает исключение {

    super.setUp();
    setActivityInitialTouchMode(false);
    _activity = (GameTemplate) getActivity();
    <...>

}`

как инициализация теста.

Я написал тест, чтобы убедиться, что событие keyUp обрабатывается хорошо:

`public void testReturnState() {

    this.sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
    _instrumentation.waitForIdleSync();
assertTrue(_logic.getSerp().state().equals(SerpentState.SERP_MOVES_FORWARD));

}`

Он работает нормально, но я написал еще один тест:

`public void testKeysSimple() {

    this.sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
    assertTrue(_logic.getSerp().state().equals(SerpentState.SERP_MOVES_LEFT));

}`

Это не удается, я думаю, это происходит по одной из двух причин:

1) программа еще не обработала событие keyDown;

2) программа обработала события keyDown и keyUp

Я новичок в тестировании, может все можно было бы сделать намного проще по другому. Пожалуйста помогите.

Я попытался добавить повторы в тесте:

public void testKeysUpDown() {  
    int t = TSet.skips;
    this.sendRepeatedKeys(TSet.keyRepeats,KeyEvent.KEYCODE_DPAD_LEFT);
    while(t>0 && !_logic.getSerp().state().equals(SerpentState.SERP_MOVES_LEFT)) t--;
    assertTrue(t>0);
}

но тоже не получается.


person Deepscorn    schedule 08.08.2011    source источник


Ответы (2)


Вам понадобится Instrumentation#sendKeySync. чтобы иметь полный контроль над отправленным событием.

person Diego Torres Milano    schedule 08.08.2011

Если вы используете сенсорное взаимодействие, вы можете использовать MotionEvent.ACTION_MOVE. Это когда пользователь коснулся экрана и перетащил его, не поднимая палец вверх.

Фрагмент кода

public boolean onTouch(View v, MotionEvent rawEvent) {

    switch (rawEvent.getAction() & MotionEvent.ACTION_MASK)
    {
        case MotionEvent.ACTION_DOWN:
        // First touch on the screen
        break;

        case MotionEvent.ACTION_POINTER_DOWN:
        // Multi-touch on the screen
        break;

        case MotionEvent.ACTION_UP:
        // Lift from the screen
        break;

        case MotionEvent.ACTION_POINTER_UP:
        // Multi-Lift from the screen
        break;

        case MotionEvent.ACTION_MOVE:
        // Drag on the screen
        break;
    }

}

Шаш

person Shash316    schedule 08.08.2011
comment
Сейчас я пишу тест для события без касания. Я привел детали к моему вопросу. См. выше, это мой первый вопрос здесь, так что извините, если что-то не так. - person Deepscorn; 08.08.2011
comment
У меня есть два проекта: Game и GameTest, сначала вторые тесты. Ваш код - это метод, который нельзя запустить на тестовой стороне. Хотя, возможно, я не знаю некоторых механизмов тестирования. Если это так, скажите мне, пожалуйста. - person Deepscorn; 08.08.2011