Какой хороший способ издеваться над Java3D с помощью Mockito? - PullRequest
1 голос
/ 21 февраля 2011

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

mock(VirtualUniverse.class);

или

mock(Canvas3D.class);

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

static void loadLibraries(){
...
}

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

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

Обновление:

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

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

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

1 Ответ

1 голос
/ 24 февраля 2011

Боюсь, нет ответа на ваш вопрос.Если вы хотите избежать неожиданных статических звонков во время тестирования - это не зависит от используемой вами системы насмешек - вы можете перенести ваши звонки на 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, вы можете поиздеваться над ним.Это может сделать ваш код немного странным, но это работает.Мы используем тот же подход в нашей кодовой базе, объединяя оболочки с фабриками.

...