@TransactionConfiguration 和 @Rollback

  缺省情况下,Spring 测试框架将事务管理委托到名为 transactionManager 的 bean 上,如果您的事务管理器不是这个名字,那需要指定 transactionManager 属性名称,还可以指定 defaultRollback 属性,缺省为 true,即所有的方法都 rollback,您可以指定为 false,这样,在一些需要 rollback 的方法,指定注释标签 @Rollback(true)即可。

  对 Junit4 的注释标签支持

  看了上面 Spring 测试框架的注释标签,我们来看看一些常见的基于 Junit4 的注释标签在 Spring 测试环境中的使用方法。

  @Test(expected=…)

  此注释标签的含义是,这是一个测试,期待一个异常的发生,期待的异常通过 xxx.class 标识。例如,我们修改 AccountService.Java 的 insertIfNotExist 方法,对于传入的参数如果为空,则抛出 IllegalArgumentException,如下:

    public void insertIfNotExist(Account account) { 
        if(account==null) 
            throw new IllegalArgumentException("account is null"); 
        Account acct = accountDao.getAccountById(account.getId()); 
        if(acct==null) { 
            log.debug("No "+account+" found,would insert it."); 
            accountDao.saveAccount(account); 
        } 
        acct = null; 
    }

  然后,在测试类中增加一个测试异常的方法,如下:

    @Test(expected=IllegalArgumentException.class) 
    public void testInsertException() { 
        service.insertIfNotExist(null); 
    }

  运行结果是 green bar。

  @Test(timeout=…)

  可以给测试方法指定超时时间(毫秒级别),当测试方法的执行时间超过此值,则失败。

  比如在 AccountService 中增加如下方法:

    public void doSomeHugeJob() { 
        try { 
            Thread.sleep(2*1000); 
        } catch (InterruptedException e) { 
        } 
    }

  上述方法模拟任务执行时间 2 秒,则测试方法如下:

    @Test(timeout=3000) 
    public void testHugeJob() { 
        service.doSomeHugeJob(); 
    }

  上述测试方法期待 service.doSomeHugeJob 方法能在 3 秒内结束,执行测试结果是 green bar。

  @Repeat

  通过 @Repeat,您可以轻松的多次执行测试用例,而不用自己写 for 循环,使用方法:

    @Repeat(3) 
    @Test(expected=IllegalArgumentException.class) 
    public void testInsertException() { 
        service.insertIfNotExist(null); 
    }

  这样,testInsertException 能被执行 3 次。