我的任务是为现有的 Android 活动编写单元测试,并且编写的代码不是为了符合单元测试(紧耦合)。
场景:我有一个类 StroageManager,它在 MyActivity onCreate 方法中被实例化。
@Override
protected void onCreate(Bundle savedInstanceState)
{
StorageManager storagemanager = GetStorageManager(); // return new object of stroage manager
super.onCreate(savedInstanceState);.....
...
}
Run Code Online (Sandbox Code Playgroud)
为了通过 Robolectric 创建活动实例,我需要在设置 MyActivity 之前在我的测试中模拟它。
问题:如何在通过 robolectric 创建 myActivity 对象时模拟和注入此模拟对象
注意:这是现有的 Activity,我没有太多的自由来修改 Activity 代码以进行大范围扩展。此外,我们正在使用 Mockito 框架进行模拟,因此如果您提供使用 Mockito 的示例,那就太好了。
这是我的示例代码,我尝试将 Robolectric 与 Mockito 结合使用,但无法正常工作:
@RunWith(RobolectricTestRunner.class)
public class myActivityTest {
@Mock
private StorageManager storageManager;
@InjectMocks
MyActivity myActivity;
@Before
public void setUp() {
ActivityController<MyActivity> activityController = Robolectric.buildActivity(MyActivity.class);
myActivity = activityController.get();
// when(registrationActivity.GetMetricManager()).thenReturn(mock(MetricsManager));
initMocks(this); …Run Code Online (Sandbox Code Playgroud) 因此,我在测试 Google 地图功能时遇到了问题。在我的活动中,我有回调onMapClick(LatLng latlng),其中有显示/隐藏工具栏的方法。现在,我想测试它,但我不知道如何在地图上执行点击。我试着用这个:
onView(withContentDescription("Mapa Google")).perform(click());
Run Code Online (Sandbox Code Playgroud)
和这个:
UiDevice device = UiDevice.getInstance(getInstrumentation());
UiObject map = device.findObject(new UiSelector()
.descriptionContains("Mapa Google"));
map.click();
Run Code Online (Sandbox Code Playgroud)
但它接缝,它不起作用。你知道我如何测试这种行为吗?
我./gradlew connectedAndroidtest用来测试我的 android 应用程序。
当connectedAndroidtest任务运行时,
从终端我可以获得运行许多子任务的任务。
:assembleDebugAndroidTest UP-TO-DATE
:connectedDebugAndroidTest ...
Run Code Online (Sandbox Code Playgroud)
但我不明白子任务的细节。
我尝试查找 gradle 源代码,但找不到任何有关 connectedDebugAndroidTest 任务的信息。
android任务是开源的吗?或者哪里可以知道更多的细节。
谢谢。
是否有任何解决方法可以让我们android.support.v7.app.AlertDialog在Robolectric 中进行测试?
someActivity.findViewById(R.id.alet_btn).performClick();
AlertDialog alert = ShadowAlertDialog.getLatestAlertDialog();
ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alert);
assertThat(shadowAlertDialog.getTitle()).isEqualTo("Hello");
Run Code Online (Sandbox Code Playgroud) 我正在使用 Appium 1.6 来自动化 Android UI 测试。
在此图像中,我无法从微调器中选择任何国家/地区(例如:日本)。
这是我正在使用的代码:
driver.findElement(By.id("com.akkipet.android:id/country_spinner__add_information")).click();
driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()).scrollIntoView("+ "new UiSelector().text(\"India\"));")).click()
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?单击微调器后,虽然我无法读取国家/地区值,但我可以读取其他字段,例如名字、姓氏等。
现在,我正在使用点击功能在特定坐标处点击以选择所需的选项。但这将使其特定于设备。此外,由于选项列表因环境而异,我将不得不为每个环境提供一组不同的坐标。
点击代码:
touchAction.tap (200, 850).perform();
Run Code Online (Sandbox Code Playgroud)
有人可以提出更好的解决方法吗?
automated-tests android-testing selenium-webdriver appium android-uiautomator
我的build.gradle文件中有以下依赖项
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.9.5'
Run Code Online (Sandbox Code Playgroud)
我的测试类EmailValidatorTest有以下代码
@Test
public void emailValidator_simpleEmail_returnsTrue(){
assertThat(EmailValidator.isValidEmail("name@ex.com"),is(true))
}
Run Code Online (Sandbox Code Playgroud)
但我得到的错误是Cannot resolve symbol assertThat. 我只得到assert对象。我目前正在处理来自Android Developersi,e的样本:https://github.com/googlesamples/android-testing/tree/master/unit/BasicSample。
由于冲突错误,我通过 RubyMine 运行的自动化测试失败。虽然它通过命令行运行完全正常。以下是错误:
Unable to activate aws-sdk-v1-1.67.0, because json-2.0.2 conflicts with json (~> 1.4) (Gem::ConflictError)
Run Code Online (Sandbox Code Playgroud)
我也是 ruby 的新手,所以以下是宝石列表:
actioncable (5.1.4)
actionmailer (5.1.4)
actionpack (5.1.4)
actionview (5.1.4)
activejob (5.1.4)
activemodel (5.1.4)
activerecord (5.1.4)
activesupport (5.1.4)
addressable (2.5.2)
appium_lib (9.6.1)
arel (8.0.0)
ast (2.3.0)
avro (1.8.2, 1.7.7)
awesome_print (1.8.0)
aws-partitions (1.21.0)
aws-sdk (1.67.0)
aws-sdk-acm (1.0.0)
aws-sdk-apigateway (1.1.0)
aws-sdk-applicationautoscaling (1.3.0)
aws-sdk-applicationdiscoveryservice (1.0.0)
aws-sdk-appstream (1.0.0)
aws-sdk-athena (1.0.0)
aws-sdk-autoscaling (1.3.0)
aws-sdk-batch (1.1.0)
aws-sdk-budgets (1.1.0)
aws-sdk-clouddirectory (1.0.0)
aws-sdk-cloudformation (1.1.0)
aws-sdk-cloudfront (1.0.0)
aws-sdk-cloudhsm (1.1.0)
aws-sdk-cloudhsmv2 (1.0.0)
aws-sdk-cloudsearch …Run Code Online (Sandbox Code Playgroud) 对于此代码
class Foo {
var name: String? = null
}
Run Code Online (Sandbox Code Playgroud)
kotlin 编译器生成:
private String name;
public final String getName() { ... }
public final void setName(String name) { ... }
Run Code Online (Sandbox Code Playgroud)
即使属性name没有自定义的 getter 或 setter。可以使用@JvmField注释删除多余的 get 和 set 方法。所以这段代码
class Foo {
@JvmField
var name: String? = null
}
Run Code Online (Sandbox Code Playgroud)
仅生成一个字段,无需其他方法。
public String name;
Run Code Online (Sandbox Code Playgroud)
但是有没有办法让 kotlin 编译器不为整个项目中的所有属性生成 getter 和 setter?不管它有没有注解。也许一些实验性的编译器标志?
我想要它,因为我有在 kotlin 上编写的 android 仪器测试。测试 apk 超过 65k 方法计数限制。大约 2k 个方法是生成 getter/setter 的。由于 android 构建系统中的一些错误,我无法使用 proguard …
Gradle Android 测试不支持过滤器(--tests)。
gradlew test --tests com.example.test.*
Run Code Online (Sandbox Code Playgroud)
作品。
gradlew connectedAndroidTest --tests com.example.test.*
Run Code Online (Sandbox Code Playgroud)
错误:未知的命令行选项“--tests”。
在将其标记为重复之前,请注意这不是授予被测应用程序权限,而是授予测试 apk 本身。
在我的应用程序中,有一个功能可以从Download目录 ( /sdcard/download)中获取文件,对其进行验证,然后将其复制到应用程序的私有存储 ( /data/data/com.package.myapp/files/) 中,以便在需要时可以使用该文件。
为了测试这个功能,我需要在Download目录中放置一些测试文件:一些是已知有效的,另一些是已知无效的文件。我已将这些文件放在组中的assets目录中androidTest。
在我的测试类中,我有一个@BeforeClass public static void prepareAssets()方法,它的工作是在导入和验证测试实际运行之前从assets目录中获取这些文件并将它们复制到Download文件夹中。
此准备步骤失败:
04-12 00:25:19.282 11231-11246/? E/TEST: Failed to prepare test assets
java.io.FileNotFoundException: /storage/emulated/0/Download/test1.jpg (Permission denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
at ca.mahram.android.testextstorexfer.CopyUtil.copy(CopyUtil.java:20)
at ca.mahram.android.testextstorexfer.ExampleInstrumentedTest.prepareAssets(ExampleInstrumentedTest.java:54)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at …Run Code Online (Sandbox Code Playgroud) android-testing ×10
android ×9
gradle ×2
robolectric ×2
unit-testing ×2
appium ×1
bundler ×1
filter ×1
kotlin ×1
mockito ×1
rubygems ×1