[
https://issues.jboss.org/browse/ARQ-2034?page=com.atlassian.jira.plugin.s...
]
Björn Kautler commented on ARQ-2034:
------------------------------------
[~mjobanek] Are you sure? As far as I remember what I have looked at in Arquillian code
you copied some code from the {{BlockJUnit4ClassRunner}}, having own instances of
{{withBefore}}, {{withAfter}} and so on, but calling the {{BlockJUnit4ClassRunner}}s
{{withRules}} method via reflection. In the {{withRules}} you should also have a test
available already I think, as that probably is the code that sets the instance fields that
are annotated with {{@Rule}} to the actual rule instances. So I guess you have to change
that you not hook into {{withBefore}} but already into {{withRules}} to do the enriching
before the rules.
Test enrichment and JUnit @Rule do not harmonize
------------------------------------------------
Key: ARQ-2034
URL:
https://issues.jboss.org/browse/ARQ-2034
Project: Arquillian
Issue Type: Bug
Components: Base Implementation
Affects Versions: 1.1.11.Final
Environment: junit 4.11
arquillian-junit-container 1.1.11.Final
wildfly-arquillian-container-remote 8.1.0.Final
Reporter: Björn Kautler
Assignee: Matous Jobanek
We are starting with Arquillian tests on a remote WildFly instance.
I tried to write a JUnit {{@Rule}}, that can be used to make a login call for all test
methods automatically, but I was not yet able to make it work, as I need an injected
{{@Ejb}} instance for this.
I tried to add {{@EJB private InterfaceLoginManagement interfaceLoginManagement;}} to the
{{TestRule}} implementation, but it stays {{null}}. I've read at ARQ-1954 that this
should probably work, but unfortunately it is not, at least not with the remote container
runner. {{org.jboss.arquillian.junit.extension.JUnitCoreExtension}} that should register
{{org.jboss.arquillian.junit.extension.UpdateTestResultBeforeAfter}} and
{{org.jboss.arquillian.junit.RulesEnricher}} is not even loaded on the container side.
Maybe the {{META-INF/services/}} file is missing?
Then I tried to simply give the injected instance to the rule from the test class like
{code}
@EJB private InterfaceLoginManagement interfaceLoginManagement;
@Rule private LoginRule loginRule = new LoginRule(interfaceLoginManagement);
{code}
or even
{code}
@EJB private InterfaceLoginManagement interfaceLoginManagement;
@Rule public LoginRule getLoginRule() {
return new LoginRule(() -> {
return interfaceLoginManagement;
});
}
{code}
with the {{LoginRule}} receiving a {{Supplier<InterfaceLoginManagement>}} and call
it as late as possible, i. e. in the rules {{apply()}} method. But even this is still too
early as the EJB is still {{null}} and the test enrichers are only run between the
{{@Rule}} applying and {{@Before}} methods.
So I'd like to suggest two things:
# Fix the implementation of ARQ-1954 if it should work on container side which I assume
it should
# Make the test enrichments earlier in the lifecycle, i. e. before the {{@Rule}} s are
being applied, or rather even before the {{@Rule}} methods are called, so that you at
least can use the injected instances in the {{@Rule}} annotated methods to forward them to
a rule. This is necessary even if top 1 is taken care of, because you might want to use a
3rd Party rule the code of which you cannot change.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)