我有一个应用程序大量使用 Jetpack Compose 的实验功能,因此我必须在可组合项上声明一堆注释。由于这些注释要求调用者也声明它们,所以我最终遇到了以下情况:我有一个包含以下代码的活动:
\nimport androidx.appcompat.app.AppCompatActivity\n\nimport androidx.compose.material.ExperimentalMaterialApi\nimport androidx.compose.ui.ExperimentalComposeUiApi\n\nimport com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi\nimport com.google.accompanist.pager.ExperimentalPagerApi\nimport com.google.accompanist.permissions.ExperimentalPermissionsApi\n\xe2\x80\xa6\n\nclass MainActivity : AppCompatActivity() {\n\n @ExperimentalPermissionsApi\n @ExperimentalComposeUiApi\n @ExperimentalPagerApi\n @ExperimentalMaterialNavigationApi\n @ExperimentalMaterialApi\n override fun onCreate(savedInstanceState: Bundle?) {\n // \xe2\x80\xa6 wiring up compose code (which propagates the experimental annotations)\nRun Code Online (Sandbox Code Playgroud)\n避免这种情况的另一种方法是使用@OptIn,但由于每个声明只允许使用一个,因此它不适用于我的具有多个实验功能的情况。
无论如何\xe2\x80\xa6 这在 Kotlin 1.5 中 \xe2\x80\x94 工作得很好。
\n使用 Kotlin 1.6 我收到编译错误:
\n\n\n覆盖上的选择加入要求标记注释需要基本声明上的相同标记
\n
但基本声明位于标准 API 中,我无法更改。\n如何进行编译(并像以前一样工作)?
\n我在我的项目中使用Gradle 2.12(或更新版本)和适当版本的Android Gradle插件.Gradle 2.12引入了 compileOnly配置,为什么我尝试使用它时会出现错误?
无法为参数找到方法compileOnly()
在运行完整的测试套件时,我经历了很多AppNotIdleException,但大多数情况下它们都是单独成功运行的(相关: https: //github.com/robolectric/robolectric/issues/7055)。我想确切地了解这两个 API 应如何组合以避免出现问题。
对于初学者来说,Robolectric 中有一个称为“Looper 模式”的配置,它基本上定义了何时执行不同的线程。从 Robolectric 4.5 开始,默认值是“PAUSED”,这意味着开发人员应该控制线程的执行时间。
此外,AndroidX 提供了createComposeRule(),这使得使用单个可组合项构建最小的单元测试成为可能 - 非常好。 此“撰写规则”附带一个“mainClock”,其默认行为为“自动前进”。
给出一个带有按钮的简单可组合项。我的测试的推荐设置(注释、时钟配置等)是什么?假设我希望测试针对 Android P (API=28) 运行。欢迎任何反馈。我想尽可能保持测试整洁。
这就是我今天编写测试的方式:
@Config(sdk = [Build.VERSION_CODES.P])
@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
class MyComposablesKtTest {
@get:Rule
val composeTestRule = createComposeRule()
private val buttonNode get() = composeTestRule.onNodeWithContentDescription("My Button")
@Before
fun setUp() {
composeTestRule.mainClock.autoAdvance = false
}
@Test
fun `MyComposable - …Run Code Online (Sandbox Code Playgroud) 问题:发布 gradle 项目的 javadoc 和源代码。以下代码运行良好,即使在 Gradle 5.1.1 上也是如此:
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
Run Code Online (Sandbox Code Playgroud)
但是,在 Gradle 5.1.1 中,不推荐使用以下语句:
classifier = 'sources'
...
classifier = 'javadoc'
Run Code Online (Sandbox Code Playgroud)
查看评估方法名称的 javadoc 显示:
已弃用。使用 getArchiveClassifier()
来源:https : //docs.gradle.org/current/javadoc/org/gradle/api/tasks/bundling/AbstractArchiveTask.html#setClassifier-java.lang.String-
这对我来说没有意义。
我的代码需要进行哪些更改才能继续工作而不被弃用?
Android 上的蓝牙扫描似乎有很多“隐藏功能”。对于初学者来说,有一个“30 秒限制”(Android 7.0 ble scan no result)。然后你必须在后台模式下设置一个 ScanFilter 否则你不会得到任何结果(找不到这个的参考)。
最近我发现,当我在 Android 10 上使用以下扫描模式启用扫描并关闭屏幕(大约 30 秒后)时,我没有得到任何扫描结果(我在 Google Pixel 3 和 Google Pixel 4 上观察到了这种行为) ,它在较旧的 Android 上运行良好):
/**
* Perform Bluetooth LE scan in balanced power mode. Scan results are returned at a rate that
* provides a good trade-off between scan frequency and power consumption.
*/
public static final int SCAN_MODE_BALANCED = 1;
Run Code Online (Sandbox Code Playgroud)
还有另一种扫描模式(我还没有尝试过):
/**
* Perform Bluetooth LE scan in low power mode. This is the …Run Code Online (Sandbox Code Playgroud) 最简单的形式是这样的对话框:
@Composable
fun MyDialog(
showDialogState: MutableState<Boolean>
) {
if (showDialogState.value) {
AlertDialog(onDismissRequest = { showDialogState.value = false },
// Other irrelevant attributes have been omitted
)
}
}
Run Code Online (Sandbox Code Playgroud)
如何在 Robolectric 中的此可组合项上触发“onDismissRequest”?
这通常是我构建可组合测试的方式:
@Config(sdk = [Build.VERSION_CODES.O_MR1])
@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
class MyDialogTest {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun `MyDialog - when showing state and dismissed - changes showing state`() {
val state = mutableStateOf(true)
composeTestRule.setContent {
MyDialog(
showDialogState = state
)
}
// TODO: How do I trigger dismiss!?
assertFalse(state.value)
} …Run Code Online (Sandbox Code Playgroud) 从命令行运行单元测试时,我无法加载资源.它在IntelliJ中工作正常.
我正在使用:
我有以下项目结构(多模块):
+---module1
| | build.gradle
| \---src
| +---main
| | | AndroidManifest.xml
| | |
| | +---res
| | | \---values
| | | strings.xml
| \---test
| \---java
| \---example
| | FooTest.java
+---module2
etc
Run Code Online (Sandbox Code Playgroud)
我的测试(简化)看起来像这样:
@Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class FooTest {
@Test
public void test() {
String result = Robolectric.application.getString(R.string.error_message);
assertThat(result, notNullValue());
}
}
Run Code Online (Sandbox Code Playgroud)
我得到这个堆栈跟踪:
android.content.res.Resources$NotFoundException: unknown resource 2131361826
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:311)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69) …Run Code Online (Sandbox Code Playgroud) 我想要实现的目标:
在声纳中,可以通过设置属性"sonar.libraries"来跟踪整个Projects中使用的第三方依赖项,并且可能还有更多好处(例如检测哪些违规是由外部库引起的?)
我试图做的:
我将值设置为build/intermediates/pre-dexed/debug/*.jar但这似乎没什么影响.
题:
由于不再需要将"libs"文件夹用于第三方依赖项,因此对于名为"sonar.libraries"的属性的建议是什么?
我发现质量配置文件需要多重继承,以避免在升级时进行不必要的手动操作.
例如,我们希望继承"Sonar Way"和"Android Lint"中的所有规则,并在每次升级后恢复内置配置文件,确保我们始终保持最新状态.
这个功能是否计划好了?
引自规则描述(SonarQube 4.5.5):
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
Run Code Online (Sandbox Code Playgroud)
通过向记录器提供异常类,将堆栈跟踪写入日志。
我们代码库中的问题是这样的:通过遵循Tell, don't ask原则,我们使用检查异常作为我们考虑的正常执行路径的一部分,我们不希望它们导致不合理的大日志消息.
几个例子:服务器响应错误代码,数据库语句执行失败,乐观锁定(并发用户)......
我的建议:将这个案例一分为二。
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
Run Code Online (Sandbox Code Playgroud)
和
// Compliant - exception is lost (only message is preserved) but there is business logic handling the situation
try {
/* ... */
} catch …Run Code Online (Sandbox Code Playgroud) android ×5
robolectric ×3
sonarqube ×3
gradle ×2
android-10.0 ×1
android-ble ×1
google-pixel ×1
java ×1
kotlin ×1