Android 使用机械分子';s ShadowNfcAdapter对NFC助手类进行单元测试
我正在尝试使用Robolectric测试NFC助手类。简而言之,我正在做这样的事情:Android 使用机械分子';s ShadowNfcAdapter对NFC助手类进行单元测试,android,unit-testing,nfc,robolectric,Android,Unit Testing,Nfc,Robolectric,我正在尝试使用Robolectric测试NFC助手类。简而言之,我正在做这样的事情: Activity activity = Robolectric.buildActivity(Activity.class) .create() .start() .resume() .get(); NfcAdapter nfcAdapter = ShadowNfcAdapter.getNfcAdapter(activity); 然后练习我的NFC助手类,因为它做了如下操作: i
Activity activity = Robolectric.buildActivity(Activity.class)
.create()
.start()
.resume()
.get();
NfcAdapter nfcAdapter = ShadowNfcAdapter.getNfcAdapter(activity);
然后练习我的NFC助手类,因为它做了如下操作:
if (!nfcAdapter.isEnabled()){
//more stuff
}
final Activity activty = Robolectric.setupActivity(Activity.class);
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activty);
final ShadowNfcAdapter shadowNfcAdapter = shadowOf(adapter);
shadowNfcAdapter.isEnabled()
但是,调用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)
其中,s服务
为空。事实上,当我使用调试器时,我可以看到nfcAdapter
的字段都是null或者对象本身都有null字段
这是使用ShadownFocadapter的正确方法吗?或者,当NFC助手类被触发时,用什么正确的方法来测试它是否在做正确的事情?您可以这样尝试吗:
if (!nfcAdapter.isEnabled()){
//more stuff
}
final Activity activty = Robolectric.setupActivity(Activity.class);
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activty);
final ShadowNfcAdapter shadowNfcAdapter = shadowOf(adapter);
shadowNfcAdapter.isEnabled()
这是Robolectric的一个问题,我不认为现在唯一可以解决这个问题的方法就是编写自己的Shadow类
我已经在Robolectric github上创建了一个问题使用Robolectric 3.2.2
NfcManager manager = (NfcManager)
context.getSystemService(Context.NFC_SERVICE);
NfcAdapter nfcAdapter = manager.getDefaultAdapter();
Shadows.shadowOf(nfcAdapter).setEnabled(true);
ShadowNfcAdapter
没有isEnabled()
solves#2059。因此,使用robolectric 3.0或更高版本,它应该可以工作。