2017-09-04 5 views
0

テストメソッドremoveは、IDが147のユーザーを削除しようとしていますが、このIDは存在しません。 Rollback(false)を有効にすると例外が発生しますが(予想される動作)、問題なくテストに合格します。だから私は2つの質問があります:ロールバックを使用している場合、トランザクションテストメソッドは例外をスローしません

  1. なぜロールバックを無効にするときだけテストが失敗しますか?
  2. ロールバックを有効にする可能性がありますか?

UserDaoクラスレベルで(Bean名で)注釈を@Transactional(デフォルトのオプション)を有する汎用DAOクラスから継承し、@Repositoryれます。

Hereロールバックを無効にする場合の例外です。

私は下から上に、スタックトレースを読ん5.2.10とJUnit 4.12

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@Transactional 
@ContextConfiguration({ 
     "classpath:myapp-config-test.xml", 
     "classpath:hib-test.xml"}) 
public class UserControllerTest { 

    private MockMvc mockMvc; 
    private MvcResult mvcResult; 
    private final String basePath = "https://stackoverflow.com/users/"; 

    @Autowired 
    private UserDao userDao; 

    @Before 
    public void setUp() throws Exception { 
     mockMvc = MockMvcBuilders.standaloneSetup(new UserController(userDao)).build(); 
    } 

    @Test 
    //@Rollback(false) 
    public void remove() throws Exception { 
     mockMvc.perform(delete(basePath + "147")).andExpect(status().isOk()); 
    } 
} 

答えて

2

休止状態、春のフレームワーク4.3.9を使用しています:

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:67) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:54) 
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3315) 
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3552) 
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:99) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:589) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1435) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:491) 
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3201) 
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2411) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:220) 
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68) 
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:582) 
    ... 24 more 

あなたは、その例外を見ることができますトランザクションマネージャがトランザクションをコミットしたときに発生します。

at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:582) 

トランザクションが原因です

at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3201) 

そして実際、フラッシュが実際にデータベース上で実行されるように削除が発生します:

at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:99) 

そして以降に行われた、およびメモリに保持されている変更内容をフラッシュするHibernateセッション何も削除しない削除は、例外がスローされます。

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

ので、実際に削除を実行する、と予想される例外をスローするためには、あなたがフラッシュする必要があります。

しかし、MVCコントローラの単体テストで、DAOの動作をテストするべきではありません(そしてHibernate自体がすでにテストしているHibernateの動作もテストしないでください)。代わりに、コントローラーのユニットテスト時にコントローラー(つまりDAO)の依存関係を模擬する必要があります。そしてDAOのもう一つのテストをしてください。

+0

私は単純な事実を心配しました。理論的に失敗したときにテストに合格したのはなぜですか?説明ありがとうございます – Chu

関連する問題