From f3454f72066e576078b77c43dc7e9b52a5d3de3a Mon Sep 17 00:00:00 2001 From: Mark Peterson Date: Fri, 5 Dec 2025 15:00:57 -0800 Subject: [PATCH 1/3] Adding Unit Test and Mocking Capability with Examples --- build.gradle | 3 ++ gradle/libs.versions.toml | 5 ++ src/test/TestHowTo.md | 12 +++++ src/test/java/frc/robot/ExampleTest.java | 28 +++++++++++ .../frc/robot/util/AllianceUtilsTest.java | 50 +++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 src/test/TestHowTo.md create mode 100644 src/test/java/frc/robot/ExampleTest.java create mode 100644 src/test/java/frc/robot/util/AllianceUtilsTest.java diff --git a/build.gradle b/build.gradle index 3eb689d1..3beb83a6 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,9 @@ dependencies { simulationRelease wpi.sim.enableRelease() testImplementation libs.junit.jupiter + testImplementation libs.mockito.core + testImplementation libs.mockito.junit.jupiter + testRuntimeOnly libs.junit.platform.launcher } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ca21c212..ecfadb56 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,8 @@ errorproneCore = "2.28.0" errorproneAnnotations = "2.28.0" junit = "5.10.1" junitPlatform = "1.10.1" +mockito = "5.11.0" + [libraries] wpilib-java = { module = "edu.wpi.first.gradle:edu.wpi.first.gradle.gradle.plugin", version.ref = "wpilib" } @@ -17,6 +19,9 @@ errorprone-core = { module = "com.google.errorprone:error_prone_core", version.r junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junitPlatform" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } +mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" } + [plugins] wpilib = { id = "edu.wpi.first.GradleRIO", version.ref = "wpilib" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } diff --git a/src/test/TestHowTo.md b/src/test/TestHowTo.md new file mode 100644 index 00000000..7dfed946 --- /dev/null +++ b/src/test/TestHowTo.md @@ -0,0 +1,12 @@ +## How to Run Tests +You can run the tests using the Gradle wrapper: + +```bash +./gradlew test +``` + +## How to Debug Tests +You can debug tests directly in VS Code: +1. Open the test file (e.g., [src/test/java/frc/robot/ExampleTest.java](file:///d:/dev/Reefscape2025/src/test/java/frc/robot/ExampleTest.java)). +2. Click the "Run" or "Debug" codelens above the test method or class. +3. Alternatively, use the Testing view in the sidebar to run or debug specific tests. diff --git a/src/test/java/frc/robot/ExampleTest.java b/src/test/java/frc/robot/ExampleTest.java new file mode 100644 index 00000000..bea68af8 --- /dev/null +++ b/src/test/java/frc/robot/ExampleTest.java @@ -0,0 +1,28 @@ +package frc.robot; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +import java.util.function.DoubleSupplier; + +class ExampleTest { + + @Test + void testMocking() { + // Create a mock object + DoubleSupplier mockSupplier = mock(DoubleSupplier.class); + + // Define behavior + when(mockSupplier.getAsDouble()).thenReturn(10.0); + + // Verify behavior + assertEquals(10.0, mockSupplier.getAsDouble(), 0.001); + } + + @Test + void testBasicAssertion() { + assertEquals(2, 1 + 1); + } +} diff --git a/src/test/java/frc/robot/util/AllianceUtilsTest.java b/src/test/java/frc/robot/util/AllianceUtilsTest.java new file mode 100644 index 00000000..6de92805 --- /dev/null +++ b/src/test/java/frc/robot/util/AllianceUtilsTest.java @@ -0,0 +1,50 @@ +package frc.robot.util; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mockStatic; + +import edu.wpi.first.wpilibj.DriverStation; +import edu.wpi.first.wpilibj.DriverStation.Alliance; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +class AllianceUtilsTest { + + @Test + void testIsBlue() { + try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { + mockedDriverStation + .when(DriverStation::getAlliance) + .thenReturn(Optional.of(Alliance.Blue)); + + assertTrue(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); + } + } + + @Test + void testIsRed() { + try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { + mockedDriverStation + .when(DriverStation::getAlliance) + .thenReturn(Optional.of(Alliance.Red)); + + assertTrue(AllianceUtils.isRed()); + assertFalse(AllianceUtils.isBlue()); + } + } + + @Test + void testNoAlliance() { + try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { + mockedDriverStation + .when(DriverStation::getAlliance) + .thenReturn(Optional.empty()); + + assertFalse(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); + } + } +} From 7e8870a23588c650e4106e5309851a891c677982 Mon Sep 17 00:00:00 2001 From: Mark Peterson Date: Fri, 5 Dec 2025 15:04:46 -0800 Subject: [PATCH 2/3] Fixing spotless complaints --- src/test/java/frc/robot/ExampleTest.java | 2 +- src/test/java/frc/robot/util/AllianceUtilsTest.java | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/test/java/frc/robot/ExampleTest.java b/src/test/java/frc/robot/ExampleTest.java index bea68af8..e6cdb9da 100644 --- a/src/test/java/frc/robot/ExampleTest.java +++ b/src/test/java/frc/robot/ExampleTest.java @@ -4,8 +4,8 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.junit.jupiter.api.Test; import java.util.function.DoubleSupplier; +import org.junit.jupiter.api.Test; class ExampleTest { diff --git a/src/test/java/frc/robot/util/AllianceUtilsTest.java b/src/test/java/frc/robot/util/AllianceUtilsTest.java index 6de92805..1f3b504b 100644 --- a/src/test/java/frc/robot/util/AllianceUtilsTest.java +++ b/src/test/java/frc/robot/util/AllianceUtilsTest.java @@ -15,9 +15,7 @@ class AllianceUtilsTest { @Test void testIsBlue() { try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation - .when(DriverStation::getAlliance) - .thenReturn(Optional.of(Alliance.Blue)); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Blue)); assertTrue(AllianceUtils.isBlue()); assertFalse(AllianceUtils.isRed()); @@ -27,9 +25,7 @@ void testIsBlue() { @Test void testIsRed() { try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation - .when(DriverStation::getAlliance) - .thenReturn(Optional.of(Alliance.Red)); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Red)); assertTrue(AllianceUtils.isRed()); assertFalse(AllianceUtils.isBlue()); @@ -39,9 +35,7 @@ void testIsRed() { @Test void testNoAlliance() { try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation - .when(DriverStation::getAlliance) - .thenReturn(Optional.empty()); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.empty()); assertFalse(AllianceUtils.isBlue()); assertFalse(AllianceUtils.isRed()); From 3d1da42cad7009be56b04cf77193a0af8a24c2f5 Mon Sep 17 00:00:00 2001 From: Mark Peterson Date: Fri, 5 Dec 2025 16:30:49 -0800 Subject: [PATCH 3/3] Gemini fix requests --- src/test/TestHowTo.md | 2 +- .../frc/robot/util/AllianceUtilsTest.java | 38 +++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/test/TestHowTo.md b/src/test/TestHowTo.md index 7dfed946..8130f0fd 100644 --- a/src/test/TestHowTo.md +++ b/src/test/TestHowTo.md @@ -7,6 +7,6 @@ You can run the tests using the Gradle wrapper: ## How to Debug Tests You can debug tests directly in VS Code: -1. Open the test file (e.g., [src/test/java/frc/robot/ExampleTest.java](file:///d:/dev/Reefscape2025/src/test/java/frc/robot/ExampleTest.java)). +1. Open the test file (e.g., [src/test/java/frc/robot/ExampleTest.java](java/frc/robot/ExampleTest.java)). 2. Click the "Run" or "Debug" codelens above the test method or class. 3. Alternatively, use the Testing view in the sidebar to run or debug specific tests. diff --git a/src/test/java/frc/robot/util/AllianceUtilsTest.java b/src/test/java/frc/robot/util/AllianceUtilsTest.java index 1f3b504b..95ad9b12 100644 --- a/src/test/java/frc/robot/util/AllianceUtilsTest.java +++ b/src/test/java/frc/robot/util/AllianceUtilsTest.java @@ -7,38 +7,46 @@ import edu.wpi.first.wpilibj.DriverStation; import edu.wpi.first.wpilibj.DriverStation.Alliance; import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; class AllianceUtilsTest { + private MockedStatic mockedDriverStation; + + @BeforeEach + void setUp() { + mockedDriverStation = mockStatic(DriverStation.class); + } + + @AfterEach + void tearDown() { + mockedDriverStation.close(); + } + @Test void testIsBlue() { - try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Blue)); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Blue)); - assertTrue(AllianceUtils.isBlue()); - assertFalse(AllianceUtils.isRed()); - } + assertTrue(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); } @Test void testIsRed() { - try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Red)); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Red)); - assertTrue(AllianceUtils.isRed()); - assertFalse(AllianceUtils.isBlue()); - } + assertTrue(AllianceUtils.isRed()); + assertFalse(AllianceUtils.isBlue()); } @Test void testNoAlliance() { - try (MockedStatic mockedDriverStation = mockStatic(DriverStation.class)) { - mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.empty()); + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.empty()); - assertFalse(AllianceUtils.isBlue()); - assertFalse(AllianceUtils.isRed()); - } + assertFalse(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); } }