JMockit |尝试根据参数定义不同的返回值,但会得到意外的结果

时间:2011-06-01 10:11:08

标签: java jmockit

我有一个如下课程:

class A
{
   public method doSomething()
   {
      //....

      DAO dataAccessor = new DAO();
      List<Object> result1 = dataAccessor.getData(dataAccessor.getSql1());
      List<Object> result2 = dataAccessor.getData(dataAccessor.getSql2());

      //.. do some stuff with the results

}

现在,我使用jMockit来模拟DAO类来测试上述函数。

这是我的测试类的样子:

class A_Test
{
    private A myAClass;

    @Mocked DAO mockedDAO;

    List<Object> resultToSql1, resultToSql2;

    // ... Some initializations...

    @Test
    public void testDoSomething()
    {
        new NonStrictExpectations()
        {
                mockedDAO.getSql1(); result = "SQL1";
                mockedDAO.getData(withEqual("SQL1")); result = resultToSql1;

                mockedDAO.getSql2(); result = "SQL2";
                mockedDAO.getData(withEqual("SQL2")); result = resultToSql2;
        };

        myAClass.doSomething(); 
    }
}

现在,关于getData()的第二个期望似乎掩盖了第一个,即模拟对象的行为好像我从未在期望中声明了第一行(处理sql1的那些行):

第一次调用getData()会返回空集合,而不是我初始化resultToSql1的值。第二个调用按预期返回resultToSql2

如果我评论以下一行:

mockedDAO.getData(withEqual("SQL2")); result = resultToSql2;

第一个调用返回我定义的内容 - resultToSql1,第二个调用返回空集合。 这是有道理的。

那么,我做错了什么? ?如何根据调用参数从getData()定义两个不同的返回值?

任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:3)

所以,在深入挖掘手册后,我发现:

  

...但是如果测试需要根据它在重放时收到的参数来决定记录调用的结果怎么办?我们可以通过mockit.Delegate实例...

来完成

因此,为了解决上述问题,期望块应如下所示:

    new NonStrictExpectations()
    {
            mockedDAO.getSql1(); result = "SQL1";
            mockedDAO.getSql2(); result = "SQL2";

            mockedDAO.getData(anyString);
            result = new mockit.Delegate()
            {
                List<Object> getData(String sql)
                {
                    if (sql.equals("SQL1"))
                        return resultToSql1;
                    if (sql.equals("SQL2"))
                        return resultToSql2;
                    return null;
                }
            }
    };