3

arquillian サイトの Greeter の例を使用して、基本的な arquillian 単体テストを実行しています。唯一の違いは、Greeter.java の greeting(PrintStream to, String name) 関数で log.debug を実行していることです。ロギングに slf4j を使用しています。

グリーター.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");
    }   

}

テストを実行すると、WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at Injection point [[field] @Inject private org.arquillian.example.Greeter.log] エラーが発生します。誰かがこれについて助けてくれますか?

4

4 に答える 4

15

これは CDI の問題です。そもそもプロデューサーがいないLogger

次に、そのようなプロデューサーを ShrinkWrap デプロイメントに追加する必要があります。

通常、Logger のプロデューサーは次のように記述されます。

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

このプロデューサーは注入ポイントを受け取り、SLF4JLoggerインスタンスを返します。インスタンスは、注入ポイントを含むクラスと同じ名前です。

于 2013-11-05T14:03:45.593 に答える
5

また、bean.xml の bean-discovery-mode を all に変更します

bean-discovery-mode="all"
于 2016-11-09T11:56:00.273 に答える
0

私の場合、プログラムで注射を提供する必要があります

輸入:

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

初期化

        private Logger logger;

        @Inject
        public LoggingInterceptor() {
            logger = LoggerFactory.getLogger(LoggingInterceptor.class);
        }
于 2018-09-14T13:44:56.520 に答える