如何获取模拟Telephonymanager服务Android

时间:2018-08-20 07:27:08

标签: android mockito

实际上,我想为电话管理器编写一些模拟单元测试,我正在使用Mockito框架来模拟电话服务。我根据我的配置返回了特定的操作员名称,这是行不通的。

      Context mockContext = mock(Context.class);
                TelephonyManager mockTelephonyManager = mock(TelephonyManager.class);
                when(mockContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mockTelephonyManager);
             when(mockTelephonyManager.getNetworkOperatorName()).thenReturn("SomeNetwork");
assertTrue("SomeNetwork",some.getNetworkOperatorName());
    // callling method
    SomeClass some = new SomeClass();
    some.getNetworkOperatorName();
    class SomeClass{

    public String getNetworkOperatorName(){
     TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(TELEPHONY_SERVICE);
            return telephonyManager.getNetworkOperatorName();

    }

    }

1 个答案:

答案 0 :(得分:0)

我在这里看到的是mockContext并没有注入到SomeClass实例中。 您可以使用构造函数注入来做到这一点:

SomeClass(Context context) {
  this.context = contest;
}

,然后在测试中像这样初始化它:

SomeClass some = new SomeClass(mockContext);

或者您可以使用模仿注释来创建和注入模拟:

@Mock
private Context mockContext;

@InjectMocks
private SomeClass someClass;

@Test
public void test() {
  TelephonyManager mockTelephonyManager = mock(TelephonyManager.class);
  when(mockContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mockTelephonyManager);
  when(mockTelephonyManager.getNetworkOperatorName()).thenReturn("SomeNetwork");
  assertTrue("SomeNetwork",someClass.getNetworkOperatorName());
}

在这种情况下,请确保使用@RunWith(MockitoJUnitRunner.class)注释测试类或调用MockitoAnnotations.initMocks(this)方法。

这两种方法都应该起作用。