我正在使用arquillian网站上的Greeter示例运行基本的arquillian单元测试。唯一的区别是我在Greeter.java中的greet(PrintStream to,String name)函数中执行了log.debug。我使用slf4j进行日志记录。
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");
}
}
获得WELD-001408运行测试时,在注入点[[field] @Inject private org.arquillian.example.Greeter.log]错误的类型[Logger]的类型[Logger]的不满意依赖性。有人可以帮忙吗?
答案 0 :(得分:13)
这是一个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());
}
}
此生产者收到注入点并继续返回SLF4J Logger
实例。该实例与包含注入点的类具有相同的名称。
答案 1 :(得分:3)
还将bean.xml bean-discovery-mode更改为所有
bean-discovery-mode="all"
答案 2 :(得分:0)
而不是注入Logger,当我使用LoggerFactory时,它对我来说效果很好。
private Logger log = LoggerFactory.getLogger(Greeter.class);
答案 3 :(得分:0)
就我而言,我必须以编程方式提供注射剂
导入:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
初始化
private Logger logger;
@Inject
public LoggingInterceptor() {
logger = LoggerFactory.getLogger(LoggingInterceptor.class);
}