前提・実現したいこと
JpaRepository.saveAndFlush()でEceptionが発生した場合のテストを行うためmockit.doThrow()を使用しています。
テストを行いたいメソッド内部でsaveAndFlush()の対象entityのインスタンス作成を行っている場合、saveAndFlush()戻り値がnullとなりExceptionが発生しませんでした。
しかし、saveAndFlush()の対象entityをテストを行いたいメソッドの引数に指定しテストクラスからentityを渡した場合、期待通りExceptionが発生しました。
上記違いでなぜmockit.doThrow()のExceptionが発生しないのかわからないため、ご教授いただけないでしょうか。
Exceptionが発生しないソースコード
java
1@Service 2@Transactional(readOnly = true) 3public class ServiceImpl implements Service 4{ 5 @Autowired 6 private Repository _repository; 7 8 @Override 9 @Transactional(readOnly = false, rollbackFor = Exception.class) 10 public boolean insert(String user) throws Exception 11 { 12 UserMst userMst = this.setUserMst(user); 13 try 14 { 15 _repository.saveAndFlush(userMst); 16 }catch(Exception e) 17 { 18 return false; 19 } 20 return true; 21 } 22 23 private UserMst setUserMst(String user) 24 { 25 UserMst userMst = new UserMst(); 26 userMst.setUserId(user); 27 return userMst; 28 } 29} 30
java
1@RunWith(SpringRunner.class) 2@TestExecutionListeners({ 3 DependencyInjectionTestExecutionListener.class, 4 DirtiesContextTestExecutionListener.class 5 }) 6@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 7public class ServiceImplTest 8{ 9 @Mock 10 private Repository rep; 11 12 @InjectMocks 13 private ServiceImpl service; 14 15 @Test 16 public void testInsertError01() 17 { 18 boolean actual = false; 19 try 20 { 21 // TODO:throwされない 22 doThrow(new NullPointerException()).when(rep).saveAndFlush(new UserMst()); 23 actual = service.insert("user"); 24 }catch(Exception e) 25 { 26 } 27 assertThat(actual).isEqualTo(false); // 結果がtrueとなるためNG 28 } 29} 30
Exceptionが発生したソースコード
java
1@Service 2@Transactional(readOnly = true) 3public class ServiceImpl implements Service 4{ 5 @Autowired 6 private Repository _repository; 7 8 @Override 9 @Transactional(readOnly = false, rollbackFor = Exception.class) 10 public boolean insert(UserMst userMst) throws Exception 11 { 12 userMst.setUserId(user); 13 try 14 { 15 _repository.saveAndFlush(userMst); 16 }catch(Exception e) 17 { 18 return false; 19 } 20 return true; 21 } 22} 23
java
1@RunWith(SpringRunner.class) 2@TestExecutionListeners({ 3 DependencyInjectionTestExecutionListener.class, 4 DirtiesContextTestExecutionListener.class 5 }) 6@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 7public class ServiceImplTest 8{ 9 @Mock 10 private Repository rep; 11 12 @InjectMocks 13 private ServiceImpl service; 14 15 @Test 16 public void testInsertError01() 17 { 18 UserMst userMst = new UserMst(); 19 boolean actual = false; 20 try 21 { 22 // TODO:throwされた 23 doThrow(new NullPointerException()).when(rep).saveAndFlush(userMst); 24 actual = service.insert(userMst); 25 }catch(Exception e) 26 { 27 } 28 assertThat(actual).isEqualTo(false); // 結果がfalseでOK 29 } 30} 31
上記質問はstackoverflowでも投稿しています。
※stackoverflowで回答・解決があった場合は、teratailにも記載します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。