Hi everyone,

in my testcase I would like to Mock org.apache.myfaces.extensions.cdi.core.api.resource.bundle.ResourceBundle (so that I can return test connection strings instead of production-ones). My unittest is set-up to run with org.apache.openejb.junit.ApplicationComposer and Mockito.

Testcase:

import org.mockito.Mock;
import org.apache.myfaces.extensions.cdi.core.api.resource.bundle.Bundle;

@RunWith(ApplicationComposer.class)
public class AzureSchedulerWorkerTest {
...
    @Mock
    @Bundle(SchedulerConfiguration.class)
    private transient ResourceBundle schedulerConfiguration;
...
    @MockInjector
    public Class<?> mockitoInjector() {
        return MockitoInjector.class;
    }

    @Module
    public Class<?>[] classes() {
return new Class<?>[] { ... ResourceBundle.class, ResourceBundleProducer.class, ... };
    }

    @Test
    public void testSomething() {
        ...
when(schedulerConfiguration.getValue(SchedulerConfiguration.StorageConnectionString.class)).thenReturn("UseDevelopmentStorage=true");
        ...
    }
}

Currently I receive following exception:

SEVERE: CDI Beans module deployment failed
org.apache.webbeans.exception.inject.DeploymentException: javax.enterprise.inject.AmbiguousResolutionException: Ambiguous resolution
found beans:
ResourceBundle, Name:null, WebBeans Type:PRODUCERMETHOD, API Types:[org.apache.myfaces.extensions.cdi.core.api.resource.bundle.ResourceBundle,java.io.Serializable,java.lang.Object], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default] from jar:file:/.m2/repository/org/apache/myfaces/extensions/cdi/core/myfaces-extcdi-core-impl/1.0.5/myfaces-extcdi-core-impl-1.0.5.jar!/org/apache/myfaces/extensions/cdi/core/impl/resource/bundle/ResourceBundleProducer.class ResourceBundle, Name:null, WebBeans Type:THIRDPARTY, API Types:[org.apache.myfaces.extensions.cdi.core.api.resource.bundle.ResourceBundle,java.io.Serializable], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default] from jar:file:/.m2/repository/org/apache/myfaces/extensions/cdi/core/myfaces-extcdi-core-api/1.0.5/myfaces-extcdi-core-api-1.0.5.jar!/org/apache/myfaces/extensions/cdi/core/api/resource/bundle/ResourceBundle.class at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:217) at org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:187) at org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:162)
    at org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:43)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:799) at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:612) at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:608) at org.apache.openejb.testing.ApplicationComposers.before(ApplicationComposers.java:639) at org.apache.openejb.testing.ApplicationComposers.evaluate(ApplicationComposers.java:722) at org.apache.openejb.junit.ApplicationComposer$DeployApplication.evaluate(ApplicationComposer.java:64)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: javax.enterprise.inject.AmbiguousResolutionException: Ambiguous resolution
found beans:
ResourceBundle, Name:null, WebBeans Type:PRODUCERMETHOD, API Types:[org.apache.myfaces.extensions.cdi.core.api.resource.bundle.ResourceBundle,java.io.Serializable,java.lang.Object], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default] from jar:file:/.m2/repository/org/apache/myfaces/extensions/cdi/core/myfaces-extcdi-core-impl/1.0.5/myfaces-extcdi-core-impl-1.0.5.jar!/org/apache/myfaces/extensions/cdi/core/impl/resource/bundle/ResourceBundleProducer.class ResourceBundle, Name:null, WebBeans Type:THIRDPARTY, API Types:[org.apache.myfaces.extensions.cdi.core.api.resource.bundle.ResourceBundle,java.io.Serializable], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default] from jar:file:/.m2/repository/org/apache/myfaces/extensions/cdi/core/myfaces-extcdi-core-api/1.0.5/myfaces-extcdi-core-api-1.0.5.jar!/org/apache/myfaces/extensions/cdi/core/api/resource/bundle/ResourceBundle.class at org.apache.webbeans.util.InjectionExceptionUtil.throwAmbiguousResolutionExceptionForBeans(InjectionExceptionUtil.java:104) at org.apache.webbeans.util.InjectionExceptionUtil.throwAmbiguousResolutionException(InjectionExceptionUtil.java:94) at org.apache.webbeans.util.InjectionExceptionUtil.throwAmbiguousResolutionException(InjectionExceptionUtil.java:71) at org.apache.webbeans.container.InjectionResolver.resolve(InjectionResolver.java:699) at org.apache.webbeans.container.InjectionResolver.checkInjectionPoint(InjectionResolver.java:191) at org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:954) at org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:470) at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:420) at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:200)
    ... 24 more

My question is - why does this happen and how to fix it?

I am guessing the issue could be that @Mock uses own Producer (or other magic) to do the injection and then there's ResourceBundleProducer. This assumption however does not explain the listed beans in AmbiguousException (I would expect two ambiguous producers).

I was thinking to @Specialize ResourceBundleProducer and control what is being produced but that's hell of a construct just to substitute basically a property file.

Any comments or suggestions are greatly appreciated!

br
reinis

Reply via email to