WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at injection point [[field] using arquillian

StackOverflow https://stackoverflow.com/questions/19768405

  •  03-07-2022
  •  | 
  •  

Pregunta

I am running a basic arquillian unit test, using the Greeter example on the arquillian site. The only difference is that am doing a log.debug in the greet(PrintStream to, String name) function in Greeter.java. Am using slf4j for logging.

Greeter.java

package org.arquillian.example;
import java.io.PrintStream;

import javax.inject.Inject;

import org.slf4j.Logger;

public class Greeter {

@Inject
private Logger log;

    public void greet(PrintStream to, String name) {
        log.debug("Greeter Testing");
        to.println(createGreeting(name));
    }

    public String createGreeting(String name) {
        return "Hello, " + name + "!";
    }   

}

GreeterTest.java

package org.arquillian.example;

import javax.inject.Inject;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;


@RunWith(Arquillian.class)
public class GreeterTest {

    @Inject
    Greeter greeter;    


    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
            .addClass(Greeter.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Test
    public void should_create_greeting() {

        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }   

}

Am getting WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at injection point [[field] @Inject private org.arquillian.example.Greeter.log] error when running the test. Can someone please help on this?

¿Fue útil?

Solución

This is a CDI issue. You don't have a producer for your Logger in the first place.

Secondly, any such producer should be added to the ShrinkWrap deployment.

A producer for the Logger is usually written as such:

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SLF4JProducer {

  @Produces
  public Logger producer(InjectionPoint ip){
    return LoggerFactory.getLogger(
      ip.getMember().getDeclaringClass().getName());
  }
}

This producer receives an injection point and proceeds to return a SLF4J Logger instance. The instance has the same name as the class containing the injection point.

Otros consejos

also change in bean.xml bean-discovery-mode to all

bean-discovery-mode="all"

Instead of injecting Logger, it worked just fine for me when I used LoggerFactory.

private Logger log = LoggerFactory.getLogger(Greeter.class);

In my case I must provide the injections programmatically

Import:

       import org.slf4j.Logger;
       import org.slf4j.LoggerFactory;

Initialization

        private Logger logger;

        @Inject
        public LoggingInterceptor() {
            logger = LoggerFactory.getLogger(LoggingInterceptor.class);
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top