Макет введен 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 (который я использую в коде), я все равно сделал это на случай, если в будущем поведение изменится.