【问题标题】:Android Unit Test: mocking System.currentTimeMillis()Android 单元测试:模拟 System.currentTimeMillis()
【发布时间】:2018-04-24 10:05:17
【问题描述】:

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

基本上,我的方法是根据系统时钟设置闹钟,所以在测试中我想模拟 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);

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

我该怎么做?

【问题讨论】:

标签: java android unit-testing mockito powermock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    原来我只是在类声明之前错过了@PrepareForTest(ApplicationBackgroundUtils.class)

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

    编辑:感谢 pavithraCS:

    @PrepareForTest 注解被 powermock 用来准备 指定的类或测试类。它将执行字节码 对给定类的操作以启用最终类的模拟, 静态方法..等

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2013-02-22
    • 2011-04-11
    • 2020-05-04
    相关资源
    最近更新 更多