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();
                }
        }
}

                                          

Reply via email to