实际上,我想为电话管理器编写一些模拟单元测试,我正在使用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();
}
}
答案 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)
方法。
这两种方法都应该起作用。