From d7ad50bcf7bdf2e519729a583a568d858e9e185f Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 17:17:32 -0700 Subject: [PATCH] [instrumentation_adapter] update boilerplate to use @Rule instead of FlutterTest (#2023) * Updates the boilerplate test to use `@Rule` instead of `FlutterTest`, bringing it more in line with how native Android tests work. --- packages/instrumentation_adapter/CHANGELOG.md | 4 +++ packages/instrumentation_adapter/README.md | 15 +++++------ .../instrumentationadapter/FlutterRunner.java | 25 +++++++++++++++---- .../instrumentationadapter/FlutterTest.java | 9 ------- packages/instrumentation_adapter/pubspec.yaml | 2 +- 5 files changed, 31 insertions(+), 24 deletions(-) delete mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java diff --git a/packages/instrumentation_adapter/CHANGELOG.md b/packages/instrumentation_adapter/CHANGELOG.md index d5326e512537..ace51df0cc1c 100644 --- a/packages/instrumentation_adapter/CHANGELOG.md +++ b/packages/instrumentation_adapter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0 + +* Update boilerplate test to use `@Rule` instead of `FlutterTest`. + ## 0.0.2 * Document current usage instructions, which require adding a Java test file. diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 972790bae5e0..49a33954cfbe 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -33,18 +33,15 @@ package com.example.myapp; import androidx.test.rule.ActivityTestRule; import dev.flutter.plugins.instrumentationadapter.FlutterRunner; -import dev.flutter.plugins.instrumentationadapter.FlutterTest; -import java.lang.Override; +import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends FlutterTest { - @Override - public void launchActivity() { - ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); - rule.launchActivity(null); - } -}``` +public class MainActivityTest { + @Rule + public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} +``` Use gradle commands to build an instrumentation test for Android. diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java index bc635ea080de..c823306e022c 100644 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java +++ b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterRunner.java @@ -4,8 +4,12 @@ package dev.flutter.plugins.instrumentationadapter; +import android.app.Activity; +import androidx.test.rule.ActivityTestRule; +import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ExecutionException; +import org.junit.Rule; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; @@ -15,13 +19,24 @@ public class FlutterRunner extends Runner { final Class testClass; - public FlutterRunner(Class testClass) { + public FlutterRunner(Class testClass) { super(); this.testClass = testClass; - try { - testClass.newInstance().launchActivity(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalThreadStateException("Unable to launch test"); + + // Look for an `ActivityTestRule` annotated `@Rule` and invoke `launchActivity()` + Field[] fields = testClass.getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(Rule.class)) { + try { + Object instance = testClass.newInstance(); + ActivityTestRule rule = (ActivityTestRule) field.get(instance); + rule.launchActivity(null); + } catch (InstantiationException | IllegalAccessException e) { + // This might occur if the developer did not make the rule public. + // We could call field.setAccessible(true) but it seems better to throw. + throw new RuntimeException("Unable to access activity rule", e); + } + } } } diff --git a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java b/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java deleted file mode 100644 index df6b398bddd6..000000000000 --- a/packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package dev.flutter.plugins.instrumentationadapter; - -public abstract class FlutterTest { - public abstract void launchActivity(); -} diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 693ad090f5e1..0d67157ba80f 100644 --- a/packages/instrumentation_adapter/pubspec.yaml +++ b/packages/instrumentation_adapter/pubspec.yaml @@ -1,6 +1,6 @@ name: instrumentation_adapter description: Runs tests that use the flutter_test API as platform native instrumentation tests. -version: 0.0.2 +version: 0.1.0 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter