JUnit:当测试的类不包含方法时,测试类方法会中断编译

时间:2018-09-16 07:02:24

标签: java junit

构建一个JUnit测试类。它被用作自动分级机。有些提交文件没有所有必需的类方法(即使它是规范的一部分)。当然,自动分级机只是总成绩的一部分(例如50%)。它改善了玩500场游戏的问题,以测试游戏是否按预期运行。

除了检查是否存在所有方法外,最好检查它们是否也可调用。

JUnit测试代码段:

<span class="checkbox-material">

@Test public void test_1p1t4_15() { // Test if callable try { Direction d1 = new Direction(); checkMethod(d1.getClass(), "print"); } catch (Exception e) { fail("Test fails:"+e.toString()); } } 函数有助于显示与该方法的实现相关的问题,例如可见性,例如

checkMethod

1 个答案:

答案 0 :(得分:1)

这是一个简单的示例,演示了如何使用参数查找和调用方法(如果该方法存在)。您将需要在JUnit测试中调用invokeIfExists。然后,您可以断言返回的值与您期望的值匹配。

import java.lang.reflect.*;

public class Main {

    static Object invokeIfExists(Class<?> cls, String methodName,
                                 Class<?>[] argTypes,
                                 Object callingObject, Object[] args) {
        try {
            Method method = cls.getDeclaredMethod(methodName, argTypes);
            return method.invoke(callingObject, args);
        } catch (SecurityException | NoSuchMethodException e) {
            System.err.println("Method " + methodName + " not found.");
        } catch (IllegalAccessException | IllegalArgumentException e) {
            System.err.println("Method " + methodName + " could not be invoked.");
        } catch (InvocationTargetException e) {
            System.err.println("Method " + methodName + " threw an exception.");
        }
        return null; // Or assert false, etc.
    }

    public static void main(String[] args) {
        Direction direction = new Direction("a", "b");

        // Tries to invoke "direction.print(123)"
        String printResult = (String) invokeIfExists(
            Direction.class, "print", new Class<?>[]{int.class},
            direction, new Object[]{123});
        System.out.println(printResult); // "Direction: a -> b and foo=123"

        // Tries to invoke "direction.doesntExist()"
        Object doesntExistResult = invokeIfExists(
            Direction.class, "doesntExist", new Class<?>[]{},
            direction, new Object[]{});
        System.out.println(doesntExistResult); // null
    }
}

class Direction {
    private String from, to;

    Direction(String from, String to) {
        this.from = from;
        this.to = to;
    }

    String print(int foo) {
        return "Direction: " + from + " -> " + to + " and foo=" + foo;
    }
}