package jp.terasoluna.fw.batch.blogic; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import java.util.Map; import jp.terasoluna.fw.batch.blogic.vo.BLogicParam; import jp.terasoluna.fw.batch.exception.BatchException; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Matchers; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.transaction.TransactionStatus; @RunWith(MockitoJUnitRunner.class) public class AbstractTransactionBLogicTest { @Captor private ArgumentCaptor<Map<String, TransactionStatus>> trnStsMap; /** * testExecute001 */ @Test public void testExecute001() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { return 0; } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/TestContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト int result = blogic.execute(param); assertEquals(0, result); verify(blogic).startTransactions(any(Map.class)); verify(blogic).commitTransactions(Matchers.<Map<?, ?>>any(), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(1, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } /** * testExecute002 */ @Test public void testExecute002() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { throw new BatchException("hoge"); } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/TestContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト try { blogic.execute(param); fail("An exception has not been detected."); } catch (Exception e) { assertNotNull(e); assertEquals(BatchException.class, e.getClass()); assertEquals("hoge", e.getMessage()); verify(blogic).startTransactions(any(Map.class)); verify(blogic, never()).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(1, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } } /** * testExecute003 */ @Test public void testExecute003() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { throw new NullPointerException("ぬるぽ"); } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/TestContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト try { blogic.execute(param); } catch (Exception e) { assertEquals(NullPointerException.class, e.getClass()); verify(blogic).startTransactions(any(Map.class)); verify(blogic, never()).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(1, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } } /** * testExecute004 */ @Test public void testExecute004() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { throw new OutOfMemoryError("※テスト※メモリ不足※テスト※"); } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/TestContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト try { blogic.execute(param); } catch (Exception e) { assertEquals(BatchException.class, e.getClass()); assertEquals(OutOfMemoryError.class, e.getCause().getClass()); verify(blogic).startTransactions(any(Map.class)); verify(blogic, never()).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(1, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } } /** * testExecute005 */ @Test public void testExecute005() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { return 0; } }); ApplicationContext parent = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/TestContext.xml" }); ApplicationContext child = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/NullContext.xml" }, parent); blogic.setApplicationContext(child); BLogicParam param = new BLogicParam(); // テスト int result = blogic.execute(param); assertEquals(0, result); verify(blogic).startTransactions(any(Map.class)); verify(blogic).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(1, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } /** * testExecute006 */ @Test public void testExecute006() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { return 0; } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/MultiDataSourceContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト int result = blogic.execute(param); assertEquals(0, result); verify(blogic).startTransactions(any(Map.class)); verify(blogic).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(2, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } /** * testExecute007 */ @Test public void testExecute007() { AbstractTransactionBLogic blogic = spy(new AbstractTransactionBLogic() { @Override public int doMain(BLogicParam param) { throw new RuntimeException("throwing RuntimeException"); } }); ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "jp/terasoluna/fw/batch/blogic/MultiDataSourceContext.xml" }); blogic.setApplicationContext(context); BLogicParam param = new BLogicParam(); // テスト try { blogic.execute(param); } catch (Exception e) { assertEquals(RuntimeException.class, e.getClass()); verify(blogic).startTransactions(any(Map.class)); verify(blogic, never()).commitTransactions(any(Map.class), Matchers.<Map<String, TransactionStatus>>any()); verify(blogic).endTransactions(any(Map.class), trnStsMap.capture()); assertEquals(2, trnStsMap.getValue().size()); for (Object txStatusObj : trnStsMap.getValue().values()) { TransactionStatus txStatus = TransactionStatus.class.cast(txStatusObj); assertTrue(txStatus.isCompleted()); } } } }