gpt4 book ai didi

android-studio - Android Studio中的Junit5:assertThrows和Java 8

转载 作者:行者123 更新时间:2023-12-03 18:00:08 25 4
gpt4 key购买 nike

升级到JUnit5,我们面临一个局限性:

@Test(expected = NullPointerException.class)


不再可能。这些天我们应该使用 org.junit.jupiter.api.Assertions.assertThrows。通常情况下,它需要一个lambda,并且如果我们设置

android.compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}


问题在于,我们更愿意使用Java 7进行发行(这需要大量测试才能证明我们仍在努力支持的所有古老设备都可以与Java 8一起正常工作)。

有没有一种干净的方法来设置 sourceCompatibility仅在Android Studio中进行单元测试?

最佳答案

TL; NR:以下代码可用于gradle任务,但IDE无法理解应用程序类未使用Java 8。

在具有gradle插件版本3.0.1的Android Studio 3.0.1中,以下工作正常:

tasks.all {
task ->
if (task.name.endsWith('UnitTestJavaWithJavac')) {
android.compileOptions.setSourceCompatibility(JavaVersion.VERSION_1_8)
android.compileOptions.setTargetCompatibility(JavaVersion.VERSION_1_8)
}
}
}


现在我可以写

@Test
public void throwNPE() {
assertThrows(NullPointerException.class, () ->
{ int [] nullarr = null; nullarr.clone(); }
);
}


并仍将我的应用程序代码保留在Java 7甚至Java 6中。

对于 check how Java compiler was actually configured,我可以在我的应用程序类和测试类上运行 javap

javap -cp build/intermediates/classes/debug -verbose com.example.Main | grep major
javap -cp build/intermediates/classes/test/debug -verbose com.example.Tests | grep major


结果是:

major version: 51
major version: 52


不幸的是,IDE无法理解应用程序类未使用Java 8,并在以下情况下发出警告(请参阅Java 8与Java 7不兼容的 undocumented example):

interface I {}

public class Main implements I {

<T extends I> T getI() { return (T) this };
void foo(I value) {
System.out.println("foo(I)");
}
void foo(String value) {
System.out.println("foo(String)");
}
void warn() {
foo(getI());
}
}




尽管出现此警告,“通过Proect”和“运行测试”都通过了。

关于android-studio - Android Studio中的Junit5:assertThrows和Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47535262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com