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

Java JMockit |尝试根据参数定义不同的返回值,但得到意外结果,java,jmockit,Java,Jmockit,我的课程如下: class A { public method doSomething() { //.... DAO dataAccessor = new DAO(); List<Object> result1 = dataAccessor.getData(dataAccessor.getSql1()); List<Object> result2 = dataAccessor.getData(dataAcces

我的课程如下:

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

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

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

如果我评论下一行:

mockedDAO.getData(withEqual("SQL2")); result = resultToSql2;
第一个调用返回我定义的-
resultToSql1
,第二个调用返回空集合。 这是有道理的

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

任何帮助都将不胜感激


谢谢

因此,在深入挖掘手册之后,我发现:

…但是如果测试需要根据在重播时接收的参数来决定记录调用的结果,该怎么办?我们可以通过一个
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;
                }
            }
    };
new nonstrictexpections()
{
mockedDAO.getSql1();result=“SQL1”;
mockedDAO.getSql2();result=“SQL2”;
mockedDAO.getData(anyString);
结果=新建mockit.Delegate()
{
列表getData(字符串sql)
{
if(sql.equals(“SQL1”))
返回resultToSql1;
if(sql.equals(“SQL2”))
返回resultToSql2;
返回null;
}
}
};

此解决方案有效,但原始版本也应该有效。发生的情况是,JMockit(错误地)认为两个记录的
mockedDAO.getData(具有相等(…)
期望值是相等的,因为唯一的区别是传递给
具有相等(x)
匹配器的值。为了避免这个问题,只需删除参数匹配器并直接传递
“SQL1”
“SQL2”
。(
withEqual(x)
几乎不应使用)。无论如何,我会尝试用JMockit解决这个问题。谢谢,Rogerio。我尝试使用和不使用withEqual(x)匹配器,得到了相同的结果。在不使用withEqual匹配器的情况下,它对我有效。现在我解决了这个问题,所以它甚至可以与匹配器一起工作。如果你仍然失败,那么问题是别的。
    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;
                }
            }
    };