Hi,
I've come accross a NPE while calling Instance.destroy() whith @Dependent beans
I got from the same Instance, is it normal? (I am using TomEE 7M1 + OWB 1.6.3)
More questions about Instance:
- does the remove() method on the iterator obtained via Instance.iterator() do
anything (like calling Instance.destroy() with the current object)?
- what happens if destroy() is called on an @ApplicationScoped bean
Thanks,
Xavier
import java.util.Iterator;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.apache.openejb.junit.ApplicationComposerRule;
import org.apache.openejb.testing.CdiExtensions;
import org.apache.openejb.testing.Module;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
public @CdiExtensions class InstanceTest {
public static class Bar implements Foo {}
public static class Baz implements Foo {}
public interface Foo {}
public final @Rule TestRule application = new
ApplicationComposerRule(this);
private @Inject Instance<Bar> barInstance;
private @Inject Instance<Foo> fooInstance;
public @Module Class<?>[] classes() {
return new Class<?>[] {Bar.class, Baz.class};
}
public @Test void getDestroy() {
Bar bar = this.barInstance.get();
System.out.println(bar.getClass().getName());
this.fooInstance.destroy(bar); // NPE
}
public @Test void iterateDestroy() {
for (Foo foo : this.fooInstance) {
System.out.println(foo.getClass().getName());
this.fooInstance.destroy(foo);
}
}
public @Test void iterateRemove() {
Iterator<Foo> iterator = this.fooInstance.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getClass().getName());
iterator.remove();
}
}
public @Test void selectGetDestroy() {
Bar bar = this.fooInstance.select(Bar.class).get();
System.out.println(bar.getClass().getName());
this.fooInstance.destroy(bar); // NPE
}
public @Test void selectIterateDestroy() {
for (Bar bar : this.fooInstance.select(Bar.class)) {
System.out.println(bar.getClass().getName());
this.fooInstance.destroy(bar); // NPE
}
}
public @Test void selectIterateRemove() {
Iterator<Bar> iterator =
this.fooInstance.select(Bar.class).iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getClass().getName());
iterator.remove();
}
}
}