Образцовый шаблон транзакции из Spring.Net с насмешками Rhino - PullRequest
2 голосов
/ 26 июля 2011

Я пытаюсь создать макет TransactionTemplate

var tTemplate = MockRepository.GenerateMock<TransactionTemplate>();
var tDelegate = MockRepository.GenerateMock<ITransactionCallback>();
tTemplate.Expect(x => x.Execute(tDelegate)).IgnoreArguments().Throw(new Exception());

в последней строке. Я получаю исключение NullPointerException от

at Spring.Transaction.Support.TransactionTemplate.Execute(ITransactionCallback action)

Есть идеи, в чем может быть причина?

1 Ответ

1 голос
/ 29 июля 2011

Класс TransactionTemplate в Spring.Net не имеет виртуальных методов, поэтому RhinoMocks не может переопределить метод Execute при создании макета.

Это означает, что вы фактически не заглушаете метод Execute, а вызываете реальный метод. Этот метод Execute вызывает объект IPlatformTransactionManager, который вы еще не предоставили, и поэтому возникает исключение NULL.

Учитывая, что метод Execute является частью интерфейса ITransactionOperations, вы можете избежать создания фиктивного объекта ITransactionOperations и использовать его в оставшейся части теста.

В качестве альтернативы вы можете попытаться предоставить фиктивный IPlatformTransactionManager для класса TransactionTemplate, а также реализацию ITransactionCallback.DoInTransaction () для использования синтаксиса tDelegate.Stub (). Do ().

Примерно так:

var transactionManager = MockRepository.GenerateMock<IPlatformTransactionManager>();
var mockDelegate = MockRepository.GenerateMock<ITransactionCallback>();
mockDelegate.Stub(t => t.DoInTransaction(null)).IgnoreArguments().Do(...);
var template = new TransactionTemplate(transactionManager);
template.Execute(mockDelegate);
...