View Javadoc
1   package com.atlassian.activeobjects.external;
2   
3   import com.atlassian.activeobjects.tx.Transactional;
4   import com.atlassian.sal.api.transaction.TransactionCallback;
5   import org.junit.After;
6   import org.junit.Before;
7   import org.junit.Test;
8   import org.junit.runner.RunWith;
9   import org.mockito.Mock;
10  import org.mockito.junit.MockitoJUnitRunner;
11  
12  import static org.junit.Assert.assertNotSame;
13  import static org.junit.Assert.assertSame;
14  import static org.mockito.ArgumentMatchers.any;
15  import static org.mockito.Mockito.when;
16  
17  /**
18   * Testing {@link com.atlassian.activeobjects.external.TransactionalAnnotationProcessor}
19   */
20  @RunWith(MockitoJUnitRunner.class)
21  public class TransactionalAnnotationProcessorTest {
22      private TransactionalAnnotationProcessor transactionalAnnotationProcessor;
23  
24      @Mock
25      @SuppressWarnings("unused")
26      private ActiveObjects ao;
27  
28      @Before
29      public void setUp() {
30          transactionalAnnotationProcessor = new TransactionalAnnotationProcessor(ao);
31      }
32  
33      @After
34      public void tearDown() {
35          transactionalAnnotationProcessor = null;
36      }
37  
38      @Test
39      public void testPostProcessAfterInitializationDoesNothingWhenNotAnnotated() {
40          final Object o = new Object();
41          assertSame(o, transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name"));
42      }
43  
44      @Test
45      public void testPostProcessAfterInitializationReturnsProxyWhenAnnotatedAtClassLevel() {
46          final Object o = new AnnotatedInterface() {
47          };
48          final Object proxy = transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
49          assertNotSame(o, proxy);
50      }
51  
52      @Test
53      public void testPostProcessAfterInitializationReturnsProxyWhenAnnotatedAtMethodLevel() {
54          final Object o = (AnnotatedMethodInInterface) () -> {};
55          final Object proxy = transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
56          assertNotSame(o, proxy);
57      }
58  
59      @Test
60      public void throwingExceptionInTransactionalMethodActuallyThrowsSameException() {
61          when(ao.executeInTransaction(any())).thenAnswer(invocation ->
62                  ((TransactionCallback) invocation.getArgument(0)).doInTransaction());
63  
64          final RuntimeException expectedException = new RuntimeException();
65          final Object o = (AnnotatedMethodInInterface) () -> {
66              throw expectedException;
67          };
68  
69          final AnnotatedMethodInInterface proxy = (AnnotatedMethodInInterface) transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
70          assertNotSame(o, proxy);
71          try {
72              proxy.doSomething();
73          } catch (Exception actualException) {
74              assertSame(expectedException, actualException);
75          }
76      }
77  
78      @Transactional
79      public interface AnnotatedInterface {
80      }
81  
82      public interface AnnotatedMethodInInterface {
83          @Transactional
84          @SuppressWarnings("unused")
85          void doSomething();
86      }
87  }