Как вам удается записывать модульные тесты, которые взаимодействуют с системными классами, т.е. классы Android Framework?Как модульные методы тестирования, которые взаимодействуют с классами System (или Android)
Представьте, что вы есть эти классы:
public class DeviceInfo {
public final int screenWidth, screenHeight;
public final String model;
public DeviceInfo(int screenWidth, int screenHeight, String deviceModel) {
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
this.model = deviceModel;
}
}
public class DeviceInfoProvider {
private final Context context;
public DeviceInfoProvider(Context context) {
this.context = context;
}
public DeviceInfo getScreenParams() {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int screenWidth = metrics.widthPixels;
int screenHeight = metrics.heightPixels;
String model= Build.MODEL;
DeviceInfo params = new DeviceInfo(screenWidth, screenHeight, model);
return params;
}
}
Как я могу написать тест для проверки правильного поведения метода DeviceInfoProvider.getScreenParams()
.
Следующий тест проходит, но это очень некрасиво и хрупкими:
@Test
public void testGetScreenParams() throws Exception {
// Setup
Context context = spy(RuntimeEnvironment.application);
DeviceInfoProvider deviceInfoProvider = new DeviceInfoProvider(context);
// Stub
WindowManager mockWindowManager = mock(WindowManager.class);
Display mockDisplay = mock(Display.class);
when(context.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mockWindowManager);
when(mockWindowManager.getDefaultDisplay()).thenReturn(mockDisplay);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
DisplayMetrics metrics = (DisplayMetrics) invocation.getArguments()[0];
metrics.scaledDensity = 3.25f;
metrics.widthPixels = 1081;
metrics.heightPixels = 1921;
return null;
}
}).when(mockDisplay).getMetrics(any(DisplayMetrics.class));
// Run
DeviceInfo deviceInfo = deviceInfoProvider.getScreenParams();
// Verify
assertThat(deviceInfo.screenWidth, equalTo(1081));
assertThat(deviceInfo.screenHeight, equalTo(1921));
assertThat(deviceInfo.model, equalTo(Build.MODEL));
}
Как бы вы улучшить это?
Примечание: В настоящее время я использую Robolectric, Mockito и PowerMock
абстрактный контекст конкретного кода, так что он может быть издевались для модульного тестирования. старайтесь избегать насмешек, которыми вы не владеете. – Nkosi
- это «DeviceInfoProvider», предназначенный для использования в качестве зависимости? – Nkosi
вопрос в том, почему вы хотите проверить это? Не доверяете ли вы парням Google? Вы должны сначала выполнить тестирование * своего * кода и выставить из строя зависимости, за которые вы несете ответственность. –