java – 如何对与System(或Android)类交互的单元测试方法进行单元化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何对与System(或Android)类交互的单元测试方法进行单元化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3482字,纯文字阅读大概需要5分钟。
内容图文
您如何设法编写与系统类(即Android Framework类)交互的单元测试?
想象一下,你有这些课程:
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
解决方法:
被测系统与实施问题紧密相关.尽量避免模仿你不拥有的课程.接口背后的抽象代码,并将责任委托给运行时接口后面的任何实现.
public interface DisplayProvider {
public int widthPixels;
public int heightPixels;
}
public interface BuildProvider {
public string Model;
}
重构依赖类依赖于抽象而不是结构(实现问题).
public class DeviceInfoProvider {
private final DisplayProvider display;
private final BuildProvider build;
public DeviceInfoProvider(DisplayProvider display, BuildProvider build) {
this.display = display;
this.build = build;
}
public DeviceInfo getScreenParams() {
int screenWidth = display.widthPixels;
int screenHeight = display.heightPixels;
String model = build.Model;
DeviceInfo params = new DeviceInfo(screenWidth, screenHeight, model);
return params;
}
}
单独测试单元
@Test
public void testGetScreenParams() throws Exception {
// Arrange
DisplayProvider mockDisplay = mock(DisplayProvider.class);
BuildProvider mockBuild = mock(BuildProvider.class);
DeviceInfoProvider deviceInfoProvider = new DeviceInfoProvider(mockDisplay, mockBuild);
when(mockDisplay.widthPixels).thenReturn(1081);
when(mockDisplay.heightPixels).thenReturn(1921);
when(mockBuild.Model).thenReturn(Build.MODEL);
// Act
DeviceInfo deviceInfo = deviceInfoProvider.getScreenParams();
// Assert
assertThat(deviceInfo.screenWidth, equalTo(1081));
assertThat(deviceInfo.screenHeight, equalTo(1921));
assertThat(deviceInfo.model, equalTo(Build.MODEL));
}
内容总结
以上是互联网集市为您收集整理的java – 如何对与System(或Android)类交互的单元测试方法进行单元化全部内容,希望文章能够帮你解决java – 如何对与System(或Android)类交互的单元测试方法进行单元化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。