Тестирование с помощью CDI, издевательство над bean-компонентом

Мне интересно, как я делаю тесты с CDI. и издевательские классы во время инъекций.

если у меня есть класс:

@Named
@RequestScoped
public class ItemProcessor {

  @Inject
  private ItemDao itemDao;


  public void execute() {


    List<Item> items = itemDao.fetchItems();
    for (Item item : items) {
        System.out.println("Found item " + item);
    }
  }
}

Что мне делать, если я хочу имитировать класс ItemDao во время теста, когда я хочу протестировать My ItemProcessor?


person Trind    schedule 24.05.2013    source источник


Ответы (2)


Вы можете, например, использовать CDI "Альтернативы".

@Alternative
public class TestCoderImpl implements Coder { ... }

Теперь этот bean-компонент будет использоваться только в том случае, если он объявлен в вашем beans.xml в качестве альтернативы.

<alternatives>
    <class>package.TestCoderImpl</class>
</alternatives>

Дополнительная информация.

person Csaba    schedule 24.05.2013
comment
Могу ли я получить свой обычный bean-компонент без аннотации @Alternative и просто выполнять ‹altnernatives/› во время теста? - person Trind; 24.05.2013
comment
Конечно, ваш обычный bean-компонент не будет иметь аннотации @Alternative, она будет у вашего тестового bean-компонента. Вы можете активировать свой альтернативный компонент, разместив указанный тег в файле beans.xml. - person Csaba; 24.05.2013
comment
Большое спасибо за помощь:) - person Trind; 24.05.2013
comment
Можно ли сделать то же самое только с методом @Produce? - person Trind; 24.05.2013
comment
Что ж, вы можете создать bean-компонент в методе производителя на основе условия, см. здесь. Или есть более сложное решение здесь. - person Csaba; 24.05.2013

Фреймворки, такие как mockito, могут устанавливать зависимости для макетов даже при использовании внедрения полей: http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html

Однако в целом внедрение конструктора предпочтительнее именно по этой причине: тестируемость.

person rethab    schedule 24.05.2013
comment
Спасибо за помощь, но где еще искать то, что Csaba awnsered. - person Trind; 24.05.2013
comment
Я думаю, что ваш комментарий о внедрении конструктора - лучшая часть этого ответа. - person Pete; 04.06.2014