From a967281b84af5b786444b8702f775adf0c0a52a7 Mon Sep 17 00:00:00 2001
From: Matthew Hague <matthew.hague@rhul.ac.uk>
Date: Fri, 22 Oct 2021 19:51:20 +0100
Subject: [PATCH] Improve error reporting in method decl checker

---
 .../uk/ac/rhul/cs/javatester/CodeTester.java  | 39 +++++++++++--------
 .../uk/ac/rhul/cs/javatester/UnitTests.java   |  2 +-
 2 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java b/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java
index 154d676..251af0d 100644
--- a/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java
+++ b/src/main/java/uk/ac/rhul/cs/javatester/CodeTester.java
@@ -461,7 +461,7 @@ public class CodeTester {
         Class<?> returnType,
         String methodName,
         Class<?>... params
-    ) throws BaseTester.FailedTestException, NoSuchMethodException {
+    ) throws BaseTester.FailedTestException {
 
         String staticString = isStatic ? "static " : "";
         String className = getClassString(klass);
@@ -469,24 +469,29 @@ public class CodeTester {
             getClassString(returnType) + " " +
             methodName + "(" + getClassParamsString(params) + ") ";
 
-        Method m = invasiveGetMethod(klass, methodName, params);
+        String baseErr =
+            "Could not find " + staticString + "method in " + className +
+            " with signature \n\n    " +
+            methodSig;
 
-        if (!m.getReturnType().equals(returnType)) {
-            throw new BaseTester.FailedTestException(
-                "Could not find " + staticString + "method in " + className +
-                " with signature \n\n    " +
-                methodSig + "\n\n" +
-                "A similar method was found, but the return types do not match."
-            );
-        }
+        try {
+            Method m = invasiveGetMethod(klass, methodName, params);
 
-        if (isStatic != Modifier.isStatic(m.getModifiers())) {
-            throw new BaseTester.FailedTestException(
-                "Could not find " + staticString + "method in " + className +
-                " with signature\n\n    " +
-                methodSig + "\n\n" +
-                "A similar method was found, but check whether it should be static or not."
-            );
+            if (!m.getReturnType().equals(returnType)) {
+                throw new BaseTester.FailedTestException(
+                    baseErr + "\n\n" +
+                    "A similar method was found, but the return types do not match."
+                );
+            }
+
+            if (isStatic != Modifier.isStatic(m.getModifiers())) {
+                throw new BaseTester.FailedTestException(
+                    baseErr + "\n\n" +
+                    "A similar method was found, but check whether it should be static or not."
+                );
+            }
+        } catch (NoSuchMethodException e) {
+            throw new BaseTester.FailedTestException(baseErr);
         }
     }
 
diff --git a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
index 6c36f6e..ea885a3 100644
--- a/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
+++ b/src/test/java/uk/ac/rhul/cs/javatester/UnitTests.java
@@ -355,7 +355,7 @@ public class UnitTests {
         BaseTester tester = new BaseTester(ASSIGNMENT) {
             @SuppressWarnings("unused")
             public boolean testCheckMethod()
-                    throws BaseTester.FailedTestException, NoSuchMethodException {
+                    throws BaseTester.FailedTestException {
                 CodeTester ct = new CodeTester();
                 Class<?> klass = ct.loadClass(ASSIGNMENT);
                 ct.checkMethodSignature(
-- 
GitLab