簡體   English   中英

無法解析方法“assertThat(int)”

[英]Cannot resolve method 'assertThat(int)'

我正在關注具有以下測試的測試導航文檔

@RunWith(AndroidJUnit4.class)
public class TitleScreenTestJava {

    @Test
    public void testNavigationToInGameScreen() {

        // Create a TestNavHostController
        TestNavHostController navController = new TestNavHostController(
            ApplicationProvider.getApplicationContext());

        // Create a graphical FragmentScenario for the TitleScreen
        FragmentScenario<TitleScreen> titleScenario = FragmentScenario.launchInContainer(TitleScreen.class);

        titleScenario.onFragment(fragment ->
                // Set the graph on the TestNavHostController
                navController.setGraph(R.navigation.trivia);

                // Make the NavController available via the findNavController() APIs
                Navigation.setViewNavController(fragment.requireView(), navController)
        );

        // Verify that performing a click changes the NavController’s state
        onView(ViewMatchers.withId(R.id.play_btn)).perform(ViewActions.click());
        assertThat(navController.currentDestination.id).isEqualTo(R.id.in_game);
    }
}

首先,這給出了

無法解析符號“currentDestination”

經過一番挖掘,我找到了getCurrentDestination() 我還必須將id更改為getId()以修復類似的錯誤。

然后我得到

無法解析方法“assertThat(int)”

我應該導入哪個版本的assertThat() 在 JUnit 中找到了2 個版本,但都只接受一個參數。 此外,兩者都已棄用。 org.hamcrest.MatcherAssert有 3 個版本的assertThat() ,但同樣,沒有一個采用單個intInteger參數。 那么我在哪里可以找到正確版本的assertThat()呢?

除此之外,我似乎需要所有這些更改來修復官方 android 文檔中的示例,我在這里缺少什么? 或者這個例子壞了?

這來自AssertJ庫。
Maven :

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.22.0</version>
    <scope>test</scope>
</dependency>

AssertJ 是一個 Java 庫,它提供了豐富的斷言集和真正有用的錯誤消息,提高了測試代碼的可讀性,並且被設計為超級易用

// basic assertions
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron);

請參閱文檔assertThat(int)

更新:
我更深入地審查了 android 文檔。 看起來像使用了Truth 庫( Maven repo )。
根據 android 文檔和建議,Truth 是首選庫。 它是 Jetpack 文檔的一部分。
Jetpack 是一套庫,可幫助開發人員遵循最佳實踐、減少樣板代碼並編寫可跨 Android 版本和設備一致工作的代碼,以便開發人員可以專注於他們關心的代碼。


請參閱正確導入的測試示例 Git
關於assertThat(Integer)的文檔

AndroidX是Truth的延伸

不屬於 Truth 項目本身的其他擴展包括:

  • 用於測試 Android 類型的 AndroidX 測試,例如 Intent

使用 AndroidX 設置項目

    // Assertions
    androidTestImplementation "androidx.test.ext:junit:$testJunitVersion"
    androidTestImplementation "androidx.test.ext:truth:$truthVersion"

真相與 AssertJ

Truth 和 AssertJ 非常相似。 這就提出了一個問題:我們為什么要創造真理? 原因是歷史性的:當我們啟動 Truth 時,AssertJ 還不存在。 在創建它時,我們已經開始將 Google 代碼遷移到 Truth,並且我們做出了一些難以 retrofit 到 AssertJ 的設計決策。

使用“assert”而不是“assertThat”。

private static boolean getBool(int i) {     return i == 0;   }
public static void main(String[] args) {
  // assert false; !will throw error
  assert true;// nothing will happen
  assert getBool(0);
  // assert getBool(1); !will throw error
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM