代码之家  ›  专栏  ›  技术社区  ›  jack_the_beast

Android单元测试:模拟系统。currentTimeMillis()

  •  1
  • jack_the_beast  · 技术社区  · 7 年前

    我正在学习如何编写单元测试,我遇到了一些问题。

    基本上,我的方法基于系统时钟设置了一个警报,因此在测试中我想模拟system类。我试着 this answer 说。这是我的测试:

    @RunWith(PowerMockRunner.class)
    public class ApplicationBackgroundUtilsTest {
        @Mock
        private Context context;
    
        @Mock
        private AlarmManager alarmManager;
    
        @Before
        public void setup() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void registerAlarmManagerTest() {
            PowerMockito.mockStatic(System.class);
            when(context.getSystemService(Context.ALARM_SERVICE)).thenReturn(alarmManager);
            BDDMockito.given(System.currentTimeMillis()).willReturn(0L);
    
            ApplicationBackgroundUtils.getInstance().registerAlarmManager(context);
    
            verify(alarmManager, times(1)).set(eq(AlarmManager.RTC_WAKEUP), eq(120L), any(PendingIntent.class));
    
        }
    

    所以我期待着用这段代码 System.currentTimeMillis() 始终返回0,但我得到以下结果:

    Comparison Failure: 
    Expected :alarmManager.set(0, 120, <any>);
    Actual   :alarmManager.set(0, 1524564129683, null);
    

    所以我猜对系统的嘲笑是行不通的。

    我该怎么做?

    2 回复  |  直到 7 年前
        1
  •  1
  •   pavithraCS    7 年前

    @PrepareForTest powermock使用注释为测试准备指定的一个或多个类。它将对给定的类执行字节码操作,以允许模拟最终的类、静态方法。。等

        2
  •  0
  •   jack_the_beast    7 年前

    结果我只是错过了 @PrepareForTest(ApplicationBackgroundUtils.class) 在类声明之前。

    我认为这为测试类使用模拟做了准备,但如果有人想进一步澄清,那是欢迎的。

    编辑:感谢pavithraCS:

    @powermock使用PrepareForTest注释来准备 指定的测试类别。它将执行字节码 对给定类进行模拟,以模拟最终类, 静态方法。。等