标签: android-testing

将 Android Studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020年3月1日

未收到测试事件错误:

将 android studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020年3月1日。

以下是完整的错误:

java.lang.NoClassDefFoundError: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1
at jdk.internal.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:1092)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2180)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:69)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:68)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:73)

Caused by: java.lang.ClassNotFoundException: jdk.internal.reflect.GeneratedSerializationConstructorAccessor1
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 11 more
Run Code Online (Sandbox Code Playgroud)

我刚刚下载了最新的 android studio,克隆了一个项目并尝试运行单元测试。

我怎样才能解决这个问题?我正在使用嵌入式 JDK(Java 11.0)。

android android-testing android-studio android-unit-testing

2
推荐指数
1
解决办法
3202
查看次数

Firebase 应用程序中 Compose 的仪器测试

我试图在撰写中创建测试,但总是收到以下错误:

默认 FirebaseApp 在此过程中未初始化 X. 确保首先调用 FirebaseApp.initializeApp(Context)。

我试图最大限度地简化测试代码:

@get:Rule
val composeTestRule = createComposeRule()

@Test
fun test() {

    composeTestRule.setContent {
        Text("Whatever")
    }
}
Run Code Online (Sandbox Code Playgroud)

但仍然收到该错误。

我尝试过 uiThreadTestRule:

@get:Rule
val composeTestRule = createComposeRule()

@get:Rule
var uiThreadTestRule: UiThreadTestRule = UiThreadTestRule()

@Test
fun test() {
    uiThreadTestRule.runOnUiThread {
        FirebaseApp.initializeApp(InstrumentationRegistry.getInstrumentation().targetContext)
    }

    composeTestRule.setContent {
        Text("Whatever")
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还具有相同的 composeTestRule.runOnUiThread:

@get:Rule
val composeTestRule = createComposeRule()

@Test
fun test() {
    composeTestRule.runOnUiThread {
        FirebaseApp.initializeApp(InstrumentationRegistry.getInstrumentation().targetContext)
    }

    composeTestRule.setContent {
        Text("Whatever")
    }
}
Run Code Online (Sandbox Code Playgroud)

如何FirebaseApp is not initialized修复该错误以便测试该应用程序的可组合项?

更新

这似乎与 createComposeRule() 有关,导致以下测试:

@get:Rule …
Run Code Online (Sandbox Code Playgroud)

android-testing android-jetpack-compose

2
推荐指数
1
解决办法
567
查看次数

Android:如何分析本机堆转储?

我已使用该命令创建了本机堆转储文件dumpheap -n <PID> <file>.该文件采用人类可读的格式,但包含的信息太难理解.如何分析此文件并从中获取有用信息?

函数地址在函数名称的位置提供.映射在文件的底部提供.有没有任何工具来映射这些并提供有意义的输出与函数/ lib名称而不是地址(加载库/函数的符号).如果没有,那么ddms如何做到这一点?另外如何加载符号来显示函数名称?

有什么方法可以比较两个或更多本机堆转储?

我得到的转储堆文件看起来像这样

Android Native Heap Dump v1.0

总内存:13863984分配记录:3108

z 1 sz 8388608 num 1 bt 40afcd1a 40afbc0e 40119d30 40795210 407a9bae 407941a0 4076c264 40770b6c 407a47f4 407a481e 40786d44 407a6da6 407a800e 407a58c4 407a820a 40798ac8 40115bb4 4011530c

Z 1 SZ 1516906 NUM 1 BT 40afcd1a 40afbc0e 40119d30 400658fe 402563d8 5a400b10 5d6c3ed2 5d6c3efc 5d6c3f34 5d69d556 5d6a9de0 40794664 407aafa0 4076c264 40770b6c 407a47f4 407a481e 407af4a8 407aff8c 407678b0 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e 401de472 4005ddd2 40119ed4

Z …

android memory-leaks adb android-testing android-debug

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

Espresso如何在不使用R.id.viewid的情况下访问视图,就像我们在robotium中一样?

我正在从机器人切换到浓缩咖啡,我正在使用apk编写测试,我无法访问代码.在使用solo.getView("view-id")的robotium中,我们可以访问视图,但我不知道如何在浓缩咖啡中进行操作?espresso witId()方法需要R.id.viewid,我无权访问.

public class AaEspressoTest {

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.tri.re.CordActivity";
private static Class<?> launcherActivityClass;

static {
    try {
        launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

@Rule
public ActivityTestRule<?> mActivityRule = new ActivityTestRule(launcherActivityClass);


@Test public void testHello() throws Exception{

    onView(withText("Browse older recordings")).perform(click());

   //Id is not accessible shows red
    onView(withId(R.id.button)).perform(click());

}

}
Run Code Online (Sandbox Code Playgroud)

android junit4 robotium android-testing android-espresso

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

使用Power Mock运行2个Roboelectic测试类并模拟相同的静态类时发生ClassCastException异常

我有2个测试类:MyTest1和MyTest2。它们都具有相同的标头并测试相同的类,但是它们测试该类的2个非常不同的方面(您可能会因此批评我,但让我们不在此讨论):

@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = RobolectricTestData.AndroidManifestFileName)
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyStrangeClassWithStaticMethods.class)
@ParametersAreNonnullByDefault
public class MyTest1 extends MyBaseTest {

    // This is to dinamically load PowerMock. We can't use PowerMockRunner because we already use
    // RobolectricTestRunner and PowerMockRunner doesn't do robolectric's stuff.
    @Rule
    public final PowerMockRule rule = new PowerMockRule();

    /**
     * Tests set up.
     */
    @Before
    public final void setUp() throws Exception {
        super.setUp();
    }
    public void testSomething() {
        PowerMockito.mockStatic(MyStrangeClassWithStaticMethods.class);
        // do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我可以单独运行MyTest1并且所有测试都可以。我可以单独运行MyTest2,所有测试都可以。但是,当我同时运行MyTest1和MyTest2的所有测试(它们都编译到一个jar中)时,只有第一个运行类(MyTest1)可以正常运行,而第二个类则失败。所有测试都因以下异常而崩溃:

    org.mockito.exceptions.base.MockitoException: 
ClassCastException …
Run Code Online (Sandbox Code Playgroud)

java unit-testing powermock robolectric android-testing

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

Android单元测试:Cucumber-jvm + Android Instrumentation

使用:带有Android Instrumentation + Espresso的Cucumber-JVM).

参考Github链接:https://github.com/mfellner/cucumber-android.简单的样本工作正常.

使用cucumber-jvm + android检测问题: 但是在链接中的示例中,它使用了不推荐使用的ActivityInstrumentationTestCase2.我想使用谷歌所说的@Rule - ActivityTestRule类.

这里我的问题是: 对于使用cucumber-jvm,我使用的是CucumberInstrumentationCore而不是testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner".

因此,像@Rule for ActivityTestRule的Android junit注释不会被CucumberInstrumentation解析.那么有可能克服这个问题吗?

然后我决定使用cucumber-jvm + android工具必须恢复原状.我的问题不仅仅是对于已弃用的类,而且全局是使用cucumber-jvm + android检测的好主意,因为它因为注释解析而无法使用检测功能.

android android-testing cucumber-jvm

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

在运行测试之前,Android gradle跳过构建?

我想跳过构建过程并直接运行测试

./gradlew connectedDevDebug
Run Code Online (Sandbox Code Playgroud)

我也可以使用adb命令,但它一次只能在一个deivce上运行测试.

gradle android-testing android-gradle-plugin

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

使用浓缩咖啡在 EditText 中按删除(退格键)

我在浓缩咖啡中编写了一个测试用例,需要执行删除(退格)。我想出来的代码是这样的

onView(withId(R.id.testNumberEditText))
            .perform(replaceText("123"))
            .perform(pressKey(KeyEvent.KEYCODE_DEL))
            .check { view, _ ->
                assertEquals("12", (view as EditText).text.toString())
            }
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用,文本仍然是123. 知道我应该按哪个键来获得所需的结果我做错了什么吗?

android android-testing android-espresso

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

测试列表首选项

我正在尝试测试android偏好设置,而我对如何实现该结果感到有些困惑。

这是我的偏爱

<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
    android:id="@+id/numberListPreference"
    android:defaultValue="3"
    android:entries="@array/number_text"
    android:entryValues="@array/number_value"
    android:key="@string/pref_key"
    android:summary="@string/pref_summary"
    android:title="@string/pref_title" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

我想测试一下,当我更改显示的ListPreference中的数字时,实际上已更改了SharedPreference。

现在,代码可以正常工作了,我只是阻塞了测试部分。

这是我活动的一部分:

public class SettingActivity extends AppCompatActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager()
            .beginTransaction()
            .replace(android.R.id.content, new SettingsFragment())
            .commit();
    }

    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我遇到经典的“如果目标视图不属于视图层次结构”错误。

欢迎任何帮助。谢谢 !

android android-testing android-espresso

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

在 androidTest 文件夹中找不到 jUnit,但在 test 文件夹中找到

我正在 android 中编写仪器测试,但是当我导入jUnit(使用@RunWith注释)时,它无法找到 jUnit,但我已经在单元测试中(在test文件夹下)使用 jUnit 。我什至无法开始编写测试。
同样的事情也发生在AndroidJUnit4课堂上。

我已将这些内容包含在build.gradle

testCompile brazilGradle.testbuild('junit')

androidTestCompile brazilGradle.testbuild('AndroidSupportTestPackage-rules')
androidTestCompile brazilGradle.testbuild('AndroidSupportTestPackage-runner')
Run Code Online (Sandbox Code Playgroud)

我也在 defaultConfig 中包含了这个:

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
Run Code Online (Sandbox Code Playgroud)

为什么它在一个文件夹中工作而不在另一个文件夹中工作?

android junit4 android-testing android-instrumentation

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