-
Notifications
You must be signed in to change notification settings - Fork 38.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support timed transactional TestNG tests in the TestContext framework [SPR-6124] #10792
Comments
Sam Brannen commented Hi Ed, First and foremost: Good Catch! You're apparently the first person to try to run timed transactional tests with the TestNG integration in the Spring TestContext Framework. ;) I was able to verify your claim. The cause is that the I'm not sure how easy it will be to solve this issue, since Thanks for bringing this to our attention! Sam |
Ed Randall commented Maybe java.lang.InheritableThreadLocal would work? |
Sam Brannen commented Good idea. In fact, I'd already tried that as a simple proof of concept using Spring's Regards, Sam |
Ed Randall commented #10800 may be related to this bug too. |
Sam Brannen commented If you are interested in seeing this issue resolved, you are cordially invited to submit a proposal in the form of a code contribution on GitHub! ;) For details please refer to the contributor guidelines. Specifically, as discussed in the Deliverables section above, you would need to:
Regards, Sam |
Sam Brannen commented In line with my previous comment, I have added the pull-request-encouraged label to this issue. |
Bulk closing outdated, unresolved issues. Please, reopen if still relevant. |
Ed Randall opened SPR-6124 and commented
Status Quo
The Spring TestContext Framework (TCF) has never supported timed, transactional tests in conjunction with TestNG.
The reason for this is that the transaction managed by the TCF is only active for the currently executing thread; this behavior is in line with standard transaction semantics for Spring. Thus, since TestNG executes the timed test method in a new thread, the test code does not participate in the transaction managed by Spring.
Original Author's Description
If TestNG tests (which extend
AbstractTransactionalTestNGSpringContextTests
) are run with thetimeOut
attribute specified in the@Test
annotation, they fail atEntityManager.flush()
because there is no transaction.If the timeout is set to zero, they pass.
Analysis
The
invokeWithTimeout()
method in TestNG'sMethodInvocationHelper
class spawns a new thread to execute a timed test. Spring's transaction support, however, registers the current transaction resources, etc. in aThreadLocal
which is bound to the thread of the test runner. Thus, the timed test method cannot see Spring's transaction.Note that
MethodInvocationHelper
is deep in the internals of TestNG. Thus, it might be difficult to resolve this issue.Deliverables
TestExecutionListeners
(specificallyTransactionalTestExecutionListener
) are executed in the same thread as the timed test.Further Resources
Affects: 2.5.6, 3.0.5, 3.1.2
Attachments:
Issue Links:
Referenced from: commits 1b92a2f
3 votes, 6 watchers
The text was updated successfully, but these errors were encountered: