如何自动化 JUnit 中的方法名称?

How to automate the method name in JUnit?

我的代码将自动获取类名和方法名。 这将帮助我识别测试用例。 我的代码看起来像这样

final String CLASS_NAME = new Object() {
  }.getClass().getName();

@Test
  public void bigNumTest() {

    final String METHOD_NAME = new Object() {
    }.getClass().getEnclosingMethod().getName();
    String testName = CLASS_NAME + "/" + METHOD_NAME + "\n the input is";

    long bigNumber = 123456789l;
    assertEquals(testName+bigNumber, CollatzConjectureLength.main(bigNumber), conjecture(bigNumber));
 }

不过,它看起来很忙,所以我想隐藏自动化。 例如

@Test
 public void bigNumTest(){
  long bigNumber = 123456789l;
 assertEqualsWithId(CollatzConjectureLength.main(bigNumber),conjecture(bigNumber))
}

但是,我无法调用

 final String METHOD_NAME = new Object() {
        }.getClass().getEnclosingMethod().getName();

来自其他方法

另一个解决方案来自Whosebug

public static String getMethodName(final int depth)
{
  final StackTraceElement[] ste = Thread.currentThread().getStackTrace();

  //System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
  // return ste[ste.length - depth].getMethodName();  //Wrong, fails for depth = 0
  return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky
}

由于方法调用的深度,此解决方案可能会得到错误的方法名称?

有没有更好的解决办法?

如果您使用的是 JUnit 4.7 或更高版本,您可以试试这个:

public class NameRuleTest {
  @Rule
  public TestName name = new TestName();

  @Test
  public void testA() {
    assertEquals("testA", name.getMethodName());
  }

  @Test
  public void testB() {
    assertEquals("testB", name.getMethodName());
  }
}

从这里复制: https://github.com/junit-team/junit/wiki/Rules#testname-rule