Android 使用机械分子';s ShadowNfcAdapter对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

我正在尝试使用Robolectric测试NFC助手类。简而言之,我正在做这样的事情:

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或更高版本,它应该可以工作。