2015-09-23 1 views
2

Я пытаюсь использовать Robolectric для проверки класса-помощника NFC. Упрощенный, я делаю что-то вроде этого:Использование адаптера ShadowNfcAdapter от Robolectric для тестирования тестового класса класса NFC

Activity activity = Robolectric.buildActivity(Activity.class) 
    .create() 
    .start() 
    .resume() 
    .get(); 
NfcAdapter nfcAdapter = ShadowNfcAdapter.getNfcAdapter(activity); 

, а затем осуществлять свой NFC вспомогательный класс, как он делает что-то вроде этого:

if (!nfcAdapter.isEnabled()){ 
    //more stuff 
} 

Однако, вызов nfcAdapter.isEnabled() вызывает исключения нулевого указателя.

java.lang.NullPointerException 
at android.nfc.NfcAdapter.isEnabled(NfcAdapter.java:621) 
at <package>.test_NfcIntent_shouldPostToBus(NfcHelperTest.java:49) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

Исключение выглядит приходить из Андроида NfcAdapter.java

public boolean isEnabled() { 
    try { 
     return sService.getState() == STATE_ON; 
    } catch (RemoteException e) { 
     attemptDeadServiceRecovery(e); 
     return false; 
    } 
} 

где sService равна нулю. В самом деле, когда я использую отладчик, я вижу, что поля nfcAdapter являются либо нулевыми, либо объектами, которые сами имеют нулевые поля.

Это правильный способ использовать ShadowNfcAdapter? В качестве альтернативы, каков был бы правильный способ проверить, что класс-помощник NFC выполняет правильные действия, когда он запускается?

ответ

1

Это вопрос с Robolectric, и я не только один из возможных способов исправить это теперь будет писать собственный класс Shadow.

Я создал вопрос на GitHub Robolectric https://github.com/robolectric/robolectric/issues/2059

+0

https://github.com/robolectric/robolectric/pull/2088 решает # 2059. Поэтому используйте robolectric 3.0 или выше, и он должен работать. –

2

Coud вы пытаетесь так:

final Activity activty = Robolectric.setupActivity(Activity.class); 
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activty); 

final ShadowNfcAdapter shadowNfcAdapter = shadowOf(adapter); 

shadowNfcAdapter.isEnabled() 
+1

'ShadowNfcAdapter' не имеет' IsEnabled() 'http://robolectric.org/ javadoc/3.0/org/robolectric/shadows/ShadowNfcAdapter.html –

1

работал с robolectric 3.2.2

NfcManager manager = (NfcManager) 
context.getSystemService(Context.NFC_SERVICE); 
NfcAdapter nfcAdapter = manager.getDefaultAdapter(); 
Shadows.shadowOf(nfcAdapter).setEnabled(true); 

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

  • Нет связанных вопросов^_^