]
Björn Kautler commented on ARQ-2034:
------------------------------------
This would solve the second point, or is an alternate solution for the first point?
As the branch you point to seems to case about Rules enrichment, I guess it cares about
the first point (enriching rules in the container).
My question was about the second point (enriching the test method before the rules methods
are evaluated), so that you can use fields that get enriched by Arquillian in
rule-producing methods to forward injected stuff to rules you don't have under your
control and thus cannot be made to receive the inject directly.
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.