JMockit |пытаясь определить различные возвращаемые значения на основе параметров, но получая неожиданные результаты - PullRequest
0 голосов
/ 01 июня 2011

У меня есть класс, подобный следующему:

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 Ответ

3 голосов
/ 01 июня 2011

Итак, углубившись в руководство, я обнаружил, что:

... Но что, если тесту необходимо определить результат записанного вызова на основе аргументов, которые он получит во время воспроизведения? Мы можем сделать это через 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;
                }
            }
    };
...