Какой хороший способ издеваться над Java3D с помощью Mockito?

Я пытаюсь издеваться над классами Java3D для модульных тестов, например:

mock(VirtualUniverse.class);

or

mock(Canvas3D.class);

К сожалению, VirtualUniverse (на который также ссылается Canvas3D) имеет статическую ссылку на MasterControl, которая включает метод

static void loadLibraries(){
...
}

который вызывается во время насмешек и пытается загрузить внешние библиотеки, чего я и пытаюсь избежать.

Я хотел бы услышать, что люди использовали в качестве общего подхода к насмешкам, применяемому к приложениям, использующим среду Java3D, особенно если вы нашли удовлетворительный подход к работе с юниверсами.

Обновлять:

Пара вещей произошла после того, как я задал этот вопрос. Во-первых, мы узнали больше о состоянии Java3D и JavaFX. Похоже, что работа над Java3D на данный момент остановлена, чтобы сосредоточиться на JavaFX. Кроме того, в настоящее время в JavaFX планируется включить Java API в третьем квартале 2011 года. Поскольку наш существующий код основан на графе сцен, я искал другие инструменты парадигмы графа сцен и наткнулся на jMonkeyEngine (jME), который, похоже, хорошо подойдет для нас.

В то время как класс приложения jME предпочитает наследование композиции (см. com.jme3.app.SimpleApplication), было достаточно легко вставить делегатор в иерархию наследования, что позволило мне создать собственное приложение в более удобной для TDD манере. Кроме того, команда jME хорошо избегает использования статического поведения, что снова помогает в попытках смоделировать компоненты для UT.

Итак, я принимаю ответ Жолта на том основании, что он думает о деньгах с делегацией.


person Don Branson    schedule 21.02.2011    source источник


Ответы (1)


Боюсь, на ваш вопрос нет ответа. Если вы хотите избежать неожиданных статических вызовов во время тестирования — это не зависит от используемой вами фиктивной среды — вы можете перенести свои вызовы в VirtualUniverse.

Например:

public class VirtualUniverseWrapper {
  private VirtualUniverse virtualUniverse;
  // ...
  public Object foo() {
    // simple delegation instead of inheritance, because your class might be final
    return virtualUniverse.foo();
  }
}

Если вы используете VirtualUniverseWrapper, вы можете издеваться над ним. Это может сделать ваш код немного странным, но он работает. Мы используем тот же подход в нашей кодовой базе, объединяя обертки с фабриками.

person Zsolt    schedule 23.02.2011