kantery 2009-01-16 12:38
浏览 259
已采纳

junit的testxxx方法问题。

junit 里面的testXXX方法只能定义为 public 的吗?

其自身的 setU平() 和 tearDown()方法是protected 的.

  • 写回答

3条回答 默认 最新

  • etank2011 2009-01-17 00:27
    关注

    抱歉,刚才解释的时候有一些错误,在runTest中传进去的参数是方法名字,例如
    [code="java"]
    SimpleTestCase test = new SimpleTestCase("testGetName");
    [/code]
    如果调用test.run()则会运行testGetName方法,如果存在的话,如果不存在就会抛出NoSuchMethodException异常,getClass().getMethod(fName, (Class[])null)方法只能得到public的方法,但是这里并不是真正决定为什么必须是public的以test开头的方法才能被测试到
    一般想要运行一个test case类中所有的test方法时,需要一个runner类,例如junit.textui.TestRunner类,而这些runner会把参数中的TestCase包装到一个TestSuite类中,决定这两个限制的就在TestSuite中(这次是肯定的)
    在TestSuite的这个构造器中(所有其他构造器都会调用这个)
    [code="java"]
    public TestSuite(final Class<? extends TestCase> theClass)
    [/code]
    有段代码会通过反射解析传进来的对象,以获得需要测试的方法集(注:单独测试一个方法直接用TestCase.run()就可以做到,象开始的那段代码,而自动获得所有test开头的方法就是在这里)
    [code="java"]
    while (Test.class.isAssignableFrom(superClass)) {
    for (Method each : superClass.getDeclaredMethods())
    addTestMethod(each, names, theClass);
    superClass= superClass.getSuperclass();
    }
    [/code]
    构造器中会获得对象所有的方法(注:Class.getDeclaredMethods()返回所有public, protected和private的方法,具体的请看JDK),但是在addTestMethod方法中过滤了不满足要求的
    [code="java"]
    private void addTestMethod(Method m, List names, Class<? extends TestCase> theClass) {
    if (! isPublicTestMethod(m)) {
    if (isTestMethod(m))
    addTest(warning("Test method isn't public: "+m.getName()));
    return;
    }
    }
    [/code]
    isTestMethod方法代码如下
    [code="java"]
    private boolean isTestMethod(Method m) {
    return
    m.getParameterTypes().length == 0 &&
    m.getName().startsWith("test") &&
    m.getReturnType().equals(Void.TYPE);
    }
    [/code]
    看到hard code的代码了吧,符合测试条件的代码是:没有参数,没有返回值并且以test开头方法,而isPublicTestMethod方法则过滤了不是public的方法
    [code="java"]
    private boolean isPublicTestMethod(Method m) {
    return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
    }
    [/code]
    如果有一个不是public但是符合测试方法名字的方法存在,则只是添加了一个警告信息,方法不会被调用。由于isTestMethod方法是private的,所以不能override

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据