我正在尝试在Kotlin中为我的Android应用程序进行UI测试.由于使用ActivityTestRule的新系统,我无法使其工作:它正确编译,并在运行时,我得到:
java.lang.Exception: The @Rule 'mActivityRule' must be public.
at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
at org.junit.internal.runners.rules.RuleFieldValidator.validatePublic(RuleFieldValidator.java:67)
at org.junit.internal.runners.rules.RuleFieldValidator.validateField(RuleFieldValidator.java:55)
at org.junit.internal.runners.rules.RuleFieldValidator.validate(RuleFieldValidator.java:50)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:170)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runner.Computer.getRunner(Computer.java:38)
at org.junit.runner.Computer$1.runnerForClass(Computer.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84)
at org.junit.runners.Suite.<init>(Suite.java:79)
at org.junit.runner.Computer.getSuite(Computer.java:26)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:691)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:654)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
Run Code Online (Sandbox Code Playgroud)
以下是我宣称的mActivityRule:
RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {
Rule
public val mActivityRule: ActivityTestRule<MainActivity> = …Run Code Online (Sandbox Code Playgroud) Kotlin中的模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配的事实很好.
在Android中,当数据库更新时,我们使用Java开关属性继续下一个案例,如果我们不休息让代码看起来像这样:
switch (oldVersion) {
case 1: upgradeFromV1();
case 2: upgradeFromV2();
case 3: upgradeFromV3();
}
Run Code Online (Sandbox Code Playgroud)
因此,如果有人拥有数据库版本1的应用程序而错过了使用DB v2的应用程序版本,他将获得执行所需的所有升级代码.
转换为Kotlin,我们得到一个混乱:
when (oldVersion) {
1 -> {
upgradeFromV1()
upgradeFromV2()
upgradeFromV3()
}
2 -> {
upgradeFromV2()
upgradeFromV3()
}
3 -> {
upgradeFromV3()
}
}
Run Code Online (Sandbox Code Playgroud)
这里我们只有3个版本,想象当DB达到版本19时:/
无论如何,当以与开关相同的方式行动时?我试着继续没有运气.
我是Android开发人员的新手,我几乎准备好发布我的应用程序的第一个版本:)
在我的手机上测试签名版本apk时,它拒绝安装,因为调试版本随调试签名一起安装.
所以我必须卸载调试版本,但它删除了我的所有数据库(它将对我正在测试它的朋友这样做).
有没有办法管理同一个应用程序的调试和发布版本而不会丢失数据?
假设我有这样的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageButton
android:id="@+id/add_dep_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:src="@android:drawable/ic_input_add" />
<EditText
android:id="@+id/add_dep_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/add_dep_btn"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignTop="@id/add_dep_btn"
android:layout_marginLeft="5dp"
android:layout_marginStart="5dp"
android:layout_toLeftOf="@id/add_dep_btn"
android:layout_toStartOf="@id/add_dep_btn" />
<android.support.v7.widget.RecyclerView
android:id="@+id/dep_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/add_dep_btn" />
<TextView
android:id="@+id/empty_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/add_dep_text"
android:layout_margin="20dp"
android:gravity="center"
android:text="@string/no_dep"
android:textSize="22sp" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我在DialogFragment中使用它:
class DepartmentChoiceDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(activity)
builder.setTitle(R.string.choose_or_create_dep)
.setView(R.layout.department_chooser_dialog)
.setNegativeButton(android.R.string.cancel, { d, i ->
d.cancel()
})
return builder.create()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用合成来引用小部件:
override …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个apk并对其进行预测,但它失败的消息如下:
Error:ProGuard: [radis] Warning: kotlin.dom.EventListenerHandler: can't find superclass or interface org.w3c.dom.events.EventListener
Error:ProGuard: [radis] Warning: kotlin.dom.CloseableEventListener: can't find referenced class org.w3c.dom.events.EventTarget
Error:ProGuard: [radis] Warning: kotlin.dom.CloseableEventListener: can't find referenced class org.w3c.dom.events.EventListener
Error:ProGuard: [radis] Warning: kotlin.dom.DomPackage: can't find referenced class org.w3c.dom.events.MouseEvent
Error:ProGuard: [radis] Warning: kotlin.dom.DomPackage: can't find referenced class org.w3c.dom.events.Event
Run Code Online (Sandbox Code Playgroud)
我添加了我的proguard.cfg,-dontwarn在kotlin.dom.**但它没有帮助.
我有这个代码:
#[derive(StructOpt)]
pub struct Opt {
/// Data stream to send to the device
#[structopt(help = "Data to send", parse(try_from_str = "parse_hex"))]
data: Vec<u8>,
}
fn parse_hex(s: &str) -> Result<u8, ParseIntError> {
u8::from_str_radix(s, 16)
}
Run Code Online (Sandbox Code Playgroud)
这适用于myexe AA BB,但我需要将其myexe AABB作为输入。
有没有办法将自定义解析器传递structopt给解析AABB为Vec<u8>? 我只需要解析第二种形式(无空格)。
我知道我可以分两步完成(存储到String结构中的 a 然后解析它,但我喜欢我Opt的所有东西都有最终类型的想法。
我尝试了这样的解析器:
fn parse_hex_string(s: &str) -> Result<Vec<u8>, ParseIntError>
Run Code Online (Sandbox Code Playgroud)
在StructOpt大约类型不匹配宏恐慌,因为它似乎产生Vec<Vec<u8>>。
一年后回到 Android 开发,我又对浓缩咖啡感到困惑-_-
我只是想设置一个简单的浓缩咖啡测试,但它失败了:
java.lang.RuntimeException:未找到活动。您是否忘记通过调用 getActivity() 或 startActivitySync 或类似方法启动活动?
事实上,我没有看到正在启动的应用程序。这是代码:
@RunWith(AndroidJUnit4::class)
@LargeTest
class EfficioTest {
@get:Rule @JvmField var activityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
private fun getActivity() = activityRule.activity
@Test fun testInitState() {
onView(withId(R.id.store_spinner)).check(matches(isDisplayed()))
}
}
Run Code Online (Sandbox Code Playgroud)
MainActivity 位于清单中,并且在使用启动器启动时工作正常。
我错过了什么?
我不明白这个借用检查器错误:
pub fn wait_for_device(&mut self) -> RoxResult<hidapi::HidDevice> {
let mut device = self.open_device();
let start = time::Instant::now();
while device.is_err() {
device = self.open_device();
if start.elapsed().as_secs() > 30 {
return Err("Can't reconnect to device".to_owned());
}
}
Ok(device.expect("Out of while so we should have a device"))
}
pub fn open_device(&mut self) -> RoxResult<hidapi::HidDevice> {
let device_info = &self.list[0];
if let Ok(device) = self.api.open(device_info.vendor_id, device_info.product_id) {
self.current_device = Some(device_info.clone());
Ok(device)
} else {
Err(format!(
"Error opening device vip: {:x} pid: {:x}",
device_info.vendor_id, device_info.product_id …Run Code Online (Sandbox Code Playgroud) 我正面临一个提供的函数,它接受Into<Option<bool>>一个参数,但我想传递它与我当前bool相反的值.
我正在寻找一种方法来在运行时获得平台行结束字符序列(Windows的CRLF,Linux/macOS的LF).