elefant1000
elefant1000

Reputation: 43

Resuable CDI-Beans in Unit-Tests

I have an JavaEE-Application and want to use CDI in the unit-test. Currently i use org.apache.openejb.junit5.RunWithApplicationComposer and my unit tests look like this:

@RunWithApplicationComposer(mode = ExtensionMode.PER_EACH)
@Classes(cdi = true, value = {
    A.class,
    B.class,
    C.class,
    ...
    Example.class
})
public class ExampleTest {

    @Inject
    private Example testInstance;

    @Produces
    public A produceA() {
        ...
    }

    @Test
    public void test() {
        assertEquals(4, testInstance.add(2, 2));
    }

}

Here I only want to test Example.class, but for Example.class to run, A,B,C must be injectable beans.

My problem is the re-usability of the @Classes-Annotation. In my case its not only A,B,C, but about 20 classes that i need for a lot of unit tests. I don't want a @Classes annotation with 20 classes again and again at every unit-test.

I already tried a SuperClass with the @Classes-Annotation that gets extended by my unit-tests, but this doesn't work.

Do you know a more generic and reusable way to make this 20 Classes injectable beans in a unit-test?

Thanks for your help :)

Upvotes: 1

Views: 191

Answers (1)

Jonathan S. Fisher
Jonathan S. Fisher

Reputation: 8886

I'm not positive this will work, but can you try an abstract parent test class?

If that doesn't work, the other thing I thought of was to make a dummy bean that injects all 20 classes, then you just put that one in the Classes section:

@ApplicationScoped
public class TestClassesConfigurationBean {
 @Inject private A a;
 @Inject private B b;
.... 20x
}

@RunWithApplicationComposer(mode = ExtensionMode.PER_EACH)
@Classes(cdi = true, value = { TestClassesConfigurationBean.class }
})
public class ExampleTest {

Upvotes: 0

Related Questions