Макет введен SessionContext

Я внедряю SessionContext в качестве ресурса для EJB (реализация транзакций, управляемых контейнером):

@Stateless(name = "XXX", mappedName = "PPP-MMM-CCC")
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class Xxx implements ItsRemoteInterface {
   @Resource
   private SessionContext sctx;
   ....
}

Мои модульные тесты не пройдены, потому что "sctx" является нулевым, когда они работают (NullPointerException). Таким образом, единственный способ исправить это - создать класс FakeSessionContext, который реализует SessionContext, который затем я могу использовать во время теста.

instance = new Xxx();
sessionContextResourceField = Xxx.class.getDeclaredField("sctx");
sessionContextResourceField.setAccessible(true);
sessionContextResourceField.set(instance, new FakeInitialContext());

Но прежде чем сделать это, мне было интересно, есть ли более элегантный способ? Кроме создания класса FakeSessionContext? Что-то вроде заводского класса?

В случае интереса я использую jUnit 4.10 и jmockit 0.999.15.

2 ответа

Решение

Используйте jmockit, чтобы создать фиктивную версию контекста сеанса для вас, и используйте версию инструкций "when... return" jmockit, чтобы гарантировать, что фиктивный контекст возвращает значения, которые вам нужны.

Для блага других, вот как это делается в jmockit:

sessionContextResourceField.set(instance, 
            new MockUp<SessionContext>() {
                @Mock boolean getRollbackOnly() { return false; }
            }.getMockInstance());

Хотя в моем случае не было необходимости Mock getRollbackOnly (который я использую в коде), я все равно сделал это на случай, если в будущем поведение изменится.

Другие вопросы по тегам