Jmockit-mock Private Medhod, чтобы вернуть сложный объект, а затем использовать его для Expectations()

У меня есть такая ситуация, что мне нужно проверить, где код рефакторинга невозможен (по организационным причинам: ().

class ClassToTest {
    private ComplexObject createComplexObject() throws SomeException{
        //create the complex object
    }

    public ReturnObject methodToTest(RequestObject reqObj) throws SomeOtherException {
        ComplexObject complexObj = createComplexObject();
        int answer = complexObj.doSomething();
        return new ReturnObject(answer);
    }

}

Большинство примеров, которые я вижу, связаны с вызовом частных методов и заставляют их возвращать String или int и т. д. Так что здесь требование немного больше:

  1. И частный метод, и метод для тестирования находятся в одном и том же классе, который необходимо протестировать.
  2. Необходимо вызвать частный метод, чтобы вернуть его фиктивную реализацию.
  3. Используйте эту фиктивную реализацию, чтобы вернуть окончательный ответ

Пожалуйста, посоветуйте по этому поводу. Все примеры, которые я вижу, просто издеваются над частным методом, чтобы вернуть String/int, тогда как здесь мне нужен сложный объект (который сам издевается), а затем использовать его для возврата окончательного ответа из метода, который находится под тестовое задание.


person Gaurav Upadhyay    schedule 12.04.2015    source источник


Ответы (1)


Вы не хотите издеваться над приватным методом (это всего лишь внутренняя деталь реализации), а над зависимостью ComplexObject. Так:

@Test
public void exampleTest(@Mocked final ComplexObject anyCmplxObj) throws Exception
{
    new Expectations() {{ anyCmplxObj.doSomething(); result = 123; }};
    RequestObject request = new RequestObject(...);

    ReturnObject ret = new ClassToTest().methodToTest(request);

    assertEquals(123, ret.getAnswer());
}
person Rogério    schedule 12.04.2015
comment
Спасибо за ответ. Я только что заметил, что абстрактный суперкласс ComplexObject имеет пару статических инициализаторов, которые создают ошибки, пока выполняется вызов отражения конструктора ComplexObject, и поэтому тест завершается неудачно. Каким должен быть подход для таких случаев, чтобы переопределить абстрактную статическую переменную/блоки SuperClass? - person Gaurav Upadhyay; 13.04.2015