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;
}
}
};