Wszystkie metody MyService są transakcyjne. Test JUnit poniżej, dostaje liczbę przedmiotów, zapisuje nowy element, a następnie pobiera liczbę elementów, aby upewnić się, że liczy został zwiększony o 1.Spring @transaction nie działa zgodnie z oczekiwaniami w junit w trybie bez debugowania
public class MyTest extends ServiceTest{
1. int countBefore = myService.getCount(); //return n
2. myService.add(item); //item is really added to DB
3. int countAfter = myService.getCount(); //return n (sometimes n+1)
}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED)
getCount(){…}
@Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE)
add(){…}
@Ignore
@ContextConfiguration(locations = { "file:src/main/resources/xxx-context.xml",
"file:src/main/resources/xxx-data.xml",
"file:src/main/resources/xxx-services.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = false)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
TestListener.class})
public class ServiceTest extends AbstractUT{
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({TestListener.class})
public class AbstractUT{
Gdy debugowanie (3.) zwraca n + 1, co jest tym czego chcę. Ale podczas uruchamiania testu bez debugowania otrzymuję n.
Nawet czasami, gdy wykonuję test, otrzymuję n + 1 i następnym razem otrzymam n, a przy porównaniu wyjścia standardowego między dwoma wykonaniami, wygląda dokładnie tak samo. Mam włączone log4j.logger.org.springframework.transaction = śladowych i widzę:
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.add
...
Completing transaction for MyService.add
Clearing transaction synchronization
...
Initializing transaction synchronization
Getting transaction for MyService.getCount
...
Completing transaction for MyService.getCount
Clearing transaction synchronization
więc transakcje są wykonywane jedna po drugiej, ale jak to możliwe, że (3) nie widać zapisany przedmiot?
managment transakcja jest w mojej klasie konfiguracji testowej według: https://stackoverflow.com/a/28657650/353985
Jak mogę znaleźć to, co jest nie tak? Dzięki!
Czy używasz ' '? tak czy inaczej zobacz moją odpowiedź na [ten link] (http://stackoverflow.com/a/25910635/3364187). –
Xstian
Absolutnie tak. – redochka
Czy możesz dodać konfigurację i swój TestClass? – Xstian