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.

12,764 thoughts on “Integration testing transactions and optimistic locking with Spring and JUnit

  1. I all the time used to study post in news
    papers but now as I am a user of internet therefore from now I am using net for articles, thanks to
    web.

  2. I know this if off topic but I’m looking into starting my
    own weblog and was wondering what all is needed to get
    set up? I’m assuming having a blog like yours would cost a pretty penny?
    I’m not very internet savvy so I’m not 100% certain. Any recommendations
    or advice would be greatly appreciated. Thanks

  3. Hello! I know this is somewhat off-topic however I had to ask.
    Does managing a well-established blog such as yours take a lot of work?

    I’m completely new to writing a blog however
    I do write in my diary on a daily basis. I’d like to start a blog so I will be able to share my
    own experience and views online. Please let me know if you have
    any kind of suggestions or tips for new aspiring bloggers.
    Appreciate it!

  4. Portanto, se você de fato deseja perder calorias com total segurança,
    não temos dúvidas que Azulzinho dos Incas podes ser uma ótima alternativa
    para que você os resultados que busca. Portanto, se você deseja aprimorar tua vida sexual com total segurança, não temos
    dúvidas que Tribulus Power podes ser uma ótimo possibilidade para que
    você conquiste um pênis mais , encantador e atraente.
    Assim, se você pesquisa por uma solução natural, competente e segura, Power Lion pode ser uma
    das melhores escolhas pra te proteger a conquistar a vida sexual que você sempre quis. https://www.ssinvestimentos.com/g1-gel-martelo-de-thor-funciona-anvisa-composicao-preco-valor-comprar-resenha-farmacia-bula-reclame-aqui-saiba-tudo-2024/

  5. در کل

    برای افرادی که قصد دارن

    شرط آنلاین

    کار می‌کنن

    این مجموعه

    به خوبی می‌تونه

    کاربردی دربیاد

    قابل توجهه که

    سرویس‌هایی مثل

    enfejaronline

    و

    سرویس sibbеt

    حضور پررنگی دارن

    در پایان

    مناسب بود

    و

    در آینده نزدیک

    سر میزنم دوباره

    Also visit my blog اخبار ورزشی

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>