标签: android-testing

robolectric - 如何在创建 Activity 对象时模拟和注入业务类

我的任务是为现有的 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)

android unit-testing mockito robolectric android-testing

5
推荐指数
1
解决办法
2063
查看次数

Android,如何测试谷歌地图

因此,我在测试 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)

但它接缝,它不起作用。你知道我如何测试这种行为吗?

android android-testing android-espresso

5
推荐指数
1
解决办法
3528
查看次数

android gradle任务源码

./gradlew connectedAndroidtest用来测试我的 android 应用程序。

当connectedAndroidtest任务运行时,

从终端我可以获得运行许多子任务的任务。

:assembleDebugAndroidTest UP-TO-DATE
:connectedDebugAndroidTest ...
Run Code Online (Sandbox Code Playgroud)

但我不明白子任务的细节。

我尝试查找 gradle 源代码,但找不到任何有关 connectedDebugAndroidTest 任务的信息。

android任务是开源的吗?或者哪里可以知道更多的细节。

谢谢。

android gradle android-testing android-gradle-plugin

5
推荐指数
1
解决办法
2242
查看次数

ShadowAlertDialog.getLatestAlertDialog() 为 android.support.v7.app.AlertDialog 返回 null

是否有任何解决方法可以让我们android.support.v7.app.AlertDialogRobolectric 中进行测试?

   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)

android unit-testing robolectric android-testing

5
推荐指数
1
解决办法
950
查看次数

无法使用 Appium 1.6 从 Spinner 中选择一个选项

我正在使用 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

5
推荐指数
1
解决办法
1130
查看次数

无法解析符号 assertThat

我的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

android android-testing

5
推荐指数
1
解决办法
1万
查看次数

宝石冲突错误

由于冲突错误,我通过 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)

android rubygems ruby-on-rails bundler android-testing

5
推荐指数
0
解决办法
1143
查看次数

从 kotlin 代码中删除 getter 和 setter

对于此代码

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 …

android kotlin android-testing

5
推荐指数
1
解决办法
2462
查看次数

Gradle Android 测试不支持过滤器(--tests)

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”。

android filter gradle android-testing

5
推荐指数
1
解决办法
1464
查看次数

如何在 androidTest 测试中创建测试资产并授予运行时权限?

在将其标记为重复之前,请注意这不是授予被测应用程序权限,而是授予测试 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 android-testing runtime-permissions

5
推荐指数
0
解决办法
367
查看次数