Guice - Тестирование правильного поведения инжектора - getClass () vs instanceof - PullRequest
1 голос
/ 14 декабря 2011

Я готовлю презентацию Guice, где планирую продемонстрировать (правильное) поведение Guice, выполняя модульные тесты. В следующем тестовом примере я хочу убедиться, что были введены правильные типы

@Test
public void shouldInjectCorrectDependencies() {
    Injector injector = Guice.createInjector(new ModuleImpl());
    House house = injector.getInstance(House.class);

    Assert.assertTrue(house.door().getClass() == (WoodenDoor.class));
}

Теперь мне интересно, какой подход будет лучше:

  • Использование getClass () для проверки конкретного класса
  • Использование instanceof для проверки типа (и подтипов)

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Вместо рассуждений с классами, которые подвержены ошибкам, как указал Мэтью, почему бы не сделать правильный класс, реализующий метод, который при вызове возвращает ожидаемый результат?:

public class Door {
    public String getDescription() { return "Wood"; }
}

...

Injector injector = Guice.createInjector(new ModuleImpl());   
Assert.assertEquals("Wood", injector.getInstance(House.class).door().getDescription());
1 голос
/ 14 декабря 2011

Я не эксперт по Guice, но в Spring DI можно вводить экземпляры, которые не являются экземплярами ожидаемого класса. Например, в вашем примере, если House не класс, а интерфейс, то при определенных обстоятельствах (например, если вы используете транзакцию) пружина дает вам Proxy, а не экземпляр класса, который реализует интерфейс. Единственная гарантия, что у вас есть это то, что он будет реализовывать правильный интерфейс. Поэтому я бы использовал:

Assert.assertTrue(house.door().isAssignableFrom(WoodenDoor.class));
...