2017-02-28 84 views
0

我試圖寫悲觀寫入的JUnit測試。我的想法是在一個事務中執行此方法,同時在另一個事務中再次運行此方法,並嘗試修改第一個事務中從該方法返回的元素。我會期待一個異常/超時,因爲第一次調用應該鎖定該行。我做了類似於this的一些事情,但元素被第二個事務(testNewTrans方法)毫不猶豫地修改。有什麼地方我做錯了嗎?Spring Data上的LockModeType.PESSIMISTIC_WRITE

public interface RequestRepository extends CrudRepository<Object, Long> { 
    @Lock(LockModeType.PESSIMISTIC_WRITE) 
    @Query("select ... ") 
    List<Object> findABC(Pageable pageable); 
} 

在新類的junit

@RunWith(SpringRunner.class) 
@DataJpaTest 
@TransactionConfiguration(defaultRollback = true) 
public class RepositoryTest { 

@Configuration 
@ComponentScan("test.package") 
@ContextConfiguration 
public static class SpringConfig { 

} 

@Test 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void testLock() throws InterruptedException { 
    List<Object> requests1 = requestRepository.findABC(new PageRequest(0, 2)); 
    test22.testNewTrans(); // return empty list 
} 

@Component 
public class Test22 { 

private final RequestRepository requestRepository; 

public Test22(RequestRepository requestRepository) { 
    this.requestRepository = requestRepository; 
} 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
private void testNewTrans() { 
    List<Object> requests2 = requestRepository.findABC(new PageRequest(0, 2)); 
    Object aa = requests2.get(0); 
    System.out.println("=============>" + aa); 
    aa.setSomething("abc"); 
} 
} 

回答

0

testNewTrans()調用直接從testLock()意味着它不能由彈簧被截取,因此的testNewTrans()調用忽略任何@Transactional(和其他)註釋。

如果您自動裝配了包含testNewTrans()的服務並調用該服務,則會看到不同的效果。

+0

我可能仍然沒有正確連線。我正在用spring引導和'@ DataJpaTest'測試它。現在,我將testNewTrans()放在一個新的類中,作爲「@ component」和「@ ComponentScan」放到主類中,但它沒有獲取任何數據。我更新了上面的代碼。 @Kayaman – Joseph

+0

你的意思是沒有得到任何數據?我可以想象這是一個棘手的情況在單個測試中進行測試,因爲問題案例與多線程有內在關聯。 – Kayaman

相關問題