[arquillian-issues] [JBoss JIRA] (ARQ-2189) Injection into JUnit rule does not work properly
Björn Kautler (JIRA)
issues at jboss.org
Tue Jul 17 11:22:00 EDT 2018
[ https://issues.jboss.org/browse/ARQ-2189?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Björn Kautler updated ARQ-2189:
-------------------------------
Description:
We just upgraded our Arquillian version to 1.4.0.Final and now the JUnit rules do not work properly.
We have a {{LoginRule}} like
{code}
public class LoginRule implements TestRule
{
@EJB
private SecurityManagement securityManagement;
private String username;
private String password;
public LoginRule(String username, String password)
{
this.username = username;
this.password = password;
}
@Override
public Statement apply(Statement base, Description description)
{
return new Statement()
{
public void evaluate() throws Throwable
{
login();
base.evaluate();
}
};
}
...
}
{code}
If we use it in a test like
{code}
@Rule
public LoginRule login = new LoginRule("user", "pass");
@Test
public void test()
{
// do something with login
}
{code}
Unfortunately this does not work anymore, as {{securityManagement}} was not injected and so the {{login}} method in the rule fails which would have used it.
With a subclass with default parameter like
{code}
public class CertainLoginRule extends LoginRule
{
public CertainLoginRule()
{
super("user", "pass");
}
}
{code}
and the usage
{code}
@Rule
public CertainLoginRule login = new CertainLoginRule();
@Test
public void test()
{
// do something with login
}
{code}
it works properly.
We tested different variations with subclass, without, constructors with parameters, without and so on.
The significant part seems to be the parameters to the constructor. If there are none injection works as expected, if there some, injection is not done. :-(
was:
We just upgraded our Arquillian version to 1.4.0.Final and now the JUnit rules do not work properly.
We have a {{LoginRule}} like
{code}
public class LoginRule implements TestRule
{
@EJB
private SecurityManagement securityManagement;
private String username;
private String password;
public LoginRule(String username, String password)
{
this.username = username;
this.password = password;
}
@Override
public Statement apply(Statement base, Description description)
{
return new Statement()
{
public void evaluate() throws Throwable
{
login();
base.evaluate();
}
};
}
...
}
If we use it in a test like
{code}
@Rule
public LoginRule login = new LoginRule("user", "pass");
@Test
public void test()
{
// do something with login
}
{code}
Unfortunately this does not work anymore, as {{securityManagement}} was not injected and so the {{login}} method in the rule fails which would have used it.
With a subclass with default parameter like
{code}
public class CertainLoginRule extends LoginRule
{
public CertainLoginRule()
{
super("user", "pass");
}
}
{code}
and the usage
{code}
@Rule
public CertainLoginRule login = new CertainLoginRule();
@Test
public void test()
{
// do something with login
}
{code}
it works properly.
We tested different variations with subclass, without, constructors with parameters, without and so on.
The significant part seems to be the parameters to the constructor. If there are none injection works as expected, if there some, injection is not done. :-(
> Injection into JUnit rule does not work properly
> ------------------------------------------------
>
> Key: ARQ-2189
> URL: https://issues.jboss.org/browse/ARQ-2189
> Project: Arquillian
> Issue Type: Bug
> Affects Versions: 1.4.0.Final
> Reporter: Björn Kautler
>
> We just upgraded our Arquillian version to 1.4.0.Final and now the JUnit rules do not work properly.
> We have a {{LoginRule}} like
> {code}
> public class LoginRule implements TestRule
> {
> @EJB
> private SecurityManagement securityManagement;
> private String username;
> private String password;
> public LoginRule(String username, String password)
> {
> this.username = username;
> this.password = password;
> }
> @Override
> public Statement apply(Statement base, Description description)
> {
> return new Statement()
> {
> public void evaluate() throws Throwable
> {
> login();
> base.evaluate();
> }
> };
> }
> ...
> }
> {code}
> If we use it in a test like
> {code}
> @Rule
> public LoginRule login = new LoginRule("user", "pass");
> @Test
> public void test()
> {
> // do something with login
> }
> {code}
> Unfortunately this does not work anymore, as {{securityManagement}} was not injected and so the {{login}} method in the rule fails which would have used it.
> With a subclass with default parameter like
> {code}
> public class CertainLoginRule extends LoginRule
> {
> public CertainLoginRule()
> {
> super("user", "pass");
> }
> }
> {code}
> and the usage
> {code}
> @Rule
> public CertainLoginRule login = new CertainLoginRule();
> @Test
> public void test()
> {
> // do something with login
> }
> {code}
> it works properly.
> We tested different variations with subclass, without, constructors with parameters, without and so on.
> The significant part seems to be the parameters to the constructor. If there are none injection works as expected, if there some, injection is not done. :-(
--
This message was sent by Atlassian JIRA
(v7.5.0#75005)
More information about the arquillian-issues
mailing list