如何自动化 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
我的代码将自动获取类名和方法名。 这将帮助我识别测试用例。 我的代码看起来像这样
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