使用 Robolectric 遮蔽 TimeZone.getDefault

pet*_*hio 4 android robolectric

我在TimeZone.getDefault()使用 Robolectric 进行阴影处理时遇到了一些麻烦,因为我的 AppTest.class 没有在 ShadowTimeZone.class 中使用我的静态阴影 mwthod。

AppTest.class

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "../App/AndroidManifest.xml")
public class AppTest{

    @Test
    @Config(shadows = {ShadowTimeZone.class})
    public void testTimeZone() {    
        String expectedTimeZoneId = "Europe/London";

        TimeZone timeZone = TimeZone.getDefault();

        assertThat(timeZone.getID(), equalTo(expectedTimeZoneId));
    }
}
Run Code Online (Sandbox Code Playgroud)

ShadowTimeZone.class

@Implements(TimeZone.class)
public class ShadowTimeZone {

    @Implementation
    public static TimeZone getDefault() {
        return TimeZone.getTimeZone("Europe/London");
    }
}
Run Code Online (Sandbox Code Playgroud)

lop*_*par 5

您根本不需要使用阴影。使用TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"))您的测试之前,或者在@Before设置方法。

如果您仍然想使用影子,则 getDefault 的实际签名是public static synchronized,因此您可能需要添加synchronized到您的影子方法中以进行匹配。