Integration testing transactions and optimistic locking with Spring and JUnit

I did some badness today.

I wanted an integration test to check to see if my @Transactional method actually did rollback on an optimistic lock failure. It’s a pretty business critical method so I wanted to be sure that the whole @Transactional and @Version annotation voodoo actually works.

The approach I took was to inject, what I called a “slowRepository” into the object with the @Transactional method. The slowRepository is just a mockito mock of the object which “answers” (using “thenAnswer”) to the “findBy…” with some custom code.

The idea is that at some point during the @Transactional method the slowRepository is called and the “answer” code is invoked. In the test, the answer code follows along the lines of:

1. Grab the data it requires from the (not slow) repository (the repository the slowRepository is mocking)
2. Switch back the slowRepository for the not slow repository
3. Invoke the @Transactional method again on a separate thread
4. Sleep for a bit
5. Wake up and return the data from step 1

The @Transactional call on the separate thread completes and commits before slowRepository wakes up. When it does, slowRepository returns stale data and the @Transactional method then fails accordingly.

The problem I encountered was using the setters for my @Autowired dependencies on the bean with the @Transactional method. I needed to use the setters so that I could switch in and out the slowRepository, but couldn’t because Spring AOP proxies are implementations of an interface, not subclasses (by default – yes I realise you can get Spring to proxy the target class using CGLIB). I found this blog post which explains how to get at the target object behind a Spring proxy. I converted it to Scala:

…which is pretty ninja.

13,777 thoughts on “Integration testing transactions and optimistic locking with Spring and JUnit

  1. По теме “Новости и события Чечни: природа, культура, ЖКХ”, есть отличная статья.

    Смотрите сами:

    [url=https://21media.ru]https://21media.ru[/url]

  2. Добрый день Перед выбором подрядчика на разработка сайтов полезно оценить не только портфолио но и подход к аналитике SEO прототипированию и дальнейшему росту проекта. Хороший сайт создается не ради картинки а ради заявок и доверия. Подробнее: web-студия VOLT — https://volt-site.ru/uslugi/razrabotka-sajtov Особенно важно заранее продумать какие страницы будут собирать коммерческий спрос. создание интернет магазина услуги seo для сайта агентство seo аудит сайта заказать создание лендинга онлайн разработать сайт быстро создание лендинга для логистики Всего наилучшего и роста в топ

  3. Нарколог на дом в Казани — это возможность быстро получить медицинскую помощь без посещения клинике когда состояние пациента требует внимания но госпитализация в стационар пока не является обязательной. Врач приезжает по указанному адресу проводит осмотр оценивает симптомы интоксикации подбирает препараты ставит капельница и дает рекомендации по дальнейшему лечению алкоголизма наркомании или последствий употребления алкоголя и наркотиков. Выяснить больше – http://www.domen.ru

  4. Hi there to every one, since I am really keen of reading this website’s post to be updated daily.
    It carries fastidious data.

  5. たまたまインターネットでショッピングをしていた際、大変魅力的なランジェリーショップを発見することができました。商品一つ一つにオリジナリティがあり、デザインのクオリティが非常に高く、見ているだけでもワクワクするようなラインナップになっています。
    オリジナルなテイストのアイテムが豊富に用意されており、可愛らしいデザインからセクシーなデザインまで幅広く取り揃えられているので、自分好みの商品を必ず見つけることができます。素材は滑らかで着心地が抜群であり、体に優しくフィットする設計が大変魅力的です。
    ディテールの完成度が非常に高く、どの商品も安定したクオリティを保っている点が信頼につながります。流行に左右されない長く愛用できるデザインが多く、コスパの面でも非常に優れていると感じます。
    購入前の商品情報も丁寧に記載されており、安心して選択することができました。実際に商品を手に取った際の質感は、サイトの写真以上に魅力的で、大変満足しております。
    継続的にリピート購入をしたいと思います。周りの友人や知人にも安心しておすすめできるショップですので、これからのさらなる発展と新作アイテムの追加を心より楽しみにしております。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>