Я пытаюсь использовать 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 выполняет правильные действия, когда он запускается?
https://github.com/robolectric/robolectric/pull/2088 решает # 2059. Поэтому используйте robolectric 3.0 или выше, и он должен работать. –