2016-06-16 2 views
2

В настоящее время я немного озадачен Intent. Я знаю, что так называемые дополнительные функции - это Bundle, а Bundle - это внутренняя карта.Простое намерение - тест jUnit не удается

И если я что-то помещу на эту карту, с intent.putExtra("someName", "someValue");, я ожидаю, что на карте есть ключ, называемый «someName». Но это не так, согласно моему очень простому единичному тесту.

public void testIntent(){ 
    assertTrue("true != true", true); 
    assertFalse("false != false", false); 

    final String extraName = "IamAnExtra"; 
    final String extraValue = "IamAValue"; 
    Intent intent = new Intent(); 
    intent.putExtra(extraName, extraValue); 

    assertTrue("hasExtra==false", intent.hasExtra(extraName)); 
    } 

Теперь тыс результаты в следующем:

junit.framework.AssertionFailedError: hasExtra==false 

Какая магия происходит за умысел-кода? Я знаю, что он нормально работает. Является ли карта кэшированной и написанной только в том случае, если я отправляю намерение? Заранее спасибо!

Edit:

Я добавил строку assertNotNull("extras == null", intent.getExtras()); которая также терпит неудачу.

И я проверил код из методов putExtra и getExtras, который является:

public Intent putExtra(String name, String value) { 
    if (mExtras == null) { 
     mExtras = new Bundle(); 
    } 
    mExtras.putString(name, value); 
    return this; 
    } 

и

public Bundle getExtras() { 
    return (mExtras != null) 
      ? new Bundle(mExtras) 
      : null; 
    } 

Так что, если mExtras член имеет нулевое значение, то нуль возвращается для getExtras. Но putExtra создаст новый экземпляр Bundle для mExtras, поэтому mExtrasдолжен не быть пустым. Я смущен.

+0

Вы используете его как _unit test_ или как _инструментированный тест_? И какие рамки вы используете, JUnit 4? – josemigallas

+0

единичный тест. Я использовал обычную TestCase. – JacksOnF1re

+0

Я думал, что использование простого намерения можно использовать с хорошим старым блоком, не так ли? Я не собираюсь пытаться отправить его или что-то еще. – JacksOnF1re

ответ

1

Проблема в том, что вы пытаетесь протестировать на Android SDK, используя обычный Unit Test. Модульные тесты в Android следует использовать только для логики приложения, используя некоторую насмешливую библиотеку, такую ​​как mockito и простой Java-код.

Таким образом, вам необходимо либо высмеять это намерение, либо выполнить этот тест на реальном устройстве, используя параметр Instrumented Test, который я настоятельно рекомендую.

У вас есть explanation why here.

EDIT:

Этот Gradle флаг, что запись относится к:

testOptions { 
     unitTests.returnDefaultValues = true 
    } 

позволяет только тест будет работать без каких-либо предупредительного исключения, но не дает вам возможность использовать SDK. Когда вы создаете экземпляр этого Intent, вы получаете не что иное, как нулевую ссылку. В конце концов утверждение intent.hasExtra(...) не может быть правдой.

+0

Спасибо, Джо, я прочитаю каждую ссылку и сам испытаю ее завтра и приму ответ. – JacksOnF1re

Смежные вопросы