From 837a87145c11d48186f0e16165125cb75c82e8f2 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 16:41:56 -0700 Subject: [PATCH 1/5] Switch to using @Rule --- packages/instrumentation_adapter/README.md | 13 ++++------ .../instrumentationadapter/FlutterRunner.java | 25 +++++++++++++++---- .../instrumentationadapter/FlutterTest.java | 9 ------- 3 files changed, 25 insertions(+), 22 deletions(-) delete mode 100644 packages/instrumentation_adapter/android/src/main/java/dev/flutter/instrumentationadapter/FlutterTest.java diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 972790bae5e0..3a38a500889a 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); - } -}``` + @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..087306f3bc85 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(); -} From c82e263be9f19df2277e02a7f7f2367cfcb2424c Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 16:44:12 -0700 Subject: [PATCH 2/5] Update boilerplate test to use `@Rule` instead of `FlutterTest`. --- packages/instrumentation_adapter/CHANGELOG.md | 4 ++++ packages/instrumentation_adapter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) 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/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index 693ad090f5e1..d33251d305ce 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.0.3 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From 020484446f4fc84393e8e9d8250746fcefc9f2f9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 16:49:53 -0700 Subject: [PATCH 3/5] reformat --- .../java/dev/flutter/instrumentationadapter/FlutterRunner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 087306f3bc85..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 @@ -25,7 +25,7 @@ public FlutterRunner(Class testClass) { // Look for an `ActivityTestRule` annotated `@Rule` and invoke `launchActivity()` Field[] fields = testClass.getDeclaredFields(); - for (Field field: fields) { + for (Field field : fields) { if (field.isAnnotationPresent(Rule.class)) { try { Object instance = testClass.newInstance(); From 9f14eb4723c1778a88ceaf57ef1c4789daf687dc Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 16:50:00 -0700 Subject: [PATCH 4/5] Update pubspec.yaml --- packages/instrumentation_adapter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/instrumentation_adapter/pubspec.yaml b/packages/instrumentation_adapter/pubspec.yaml index d33251d305ce..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.3 +version: 0.1.0 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/instrumentation_adapter From 16185fd521c0bcb8c979ad68912fcc91836702e9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Tue, 27 Aug 2019 16:56:37 -0700 Subject: [PATCH 5/5] Update README.md --- packages/instrumentation_adapter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/instrumentation_adapter/README.md b/packages/instrumentation_adapter/README.md index 3a38a500889a..49a33954cfbe 100644 --- a/packages/instrumentation_adapter/README.md +++ b/packages/instrumentation_adapter/README.md @@ -37,7 +37,7 @@ import org.junit.Rule; import org.junit.runner.RunWith; @RunWith(FlutterRunner.class) -public class MainActivityTest extends FlutterTest { +public class MainActivityTest { @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); }