【问题标题】:CDI : @Resource inject in junit weld?CDI:@Resource 在junit 焊接中注入?
【发布时间】:2018-01-19 05:44:48
【问题描述】:

有一个简单的 Mongo DB Producer 连接到 Mongo 数据库

@SuppressWarnings({ "deprecation", "resource" })
@ApplicationScoped
public class MongoDBProducer {
    @Resource(name = "mongoUri")
    private MongoClientURI mongoClientURI;

    private DB database;

    @PostConstruct
    public void init() throws UnknownHostException {
        MongoClient mongoClient = new MongoClient(mongoClientURI);
        database =  mongoClient.getDB(mongoClientURI.getDatabase());
    }

    @Produces
    public DB createDB() {
        return database;
    }
}

我的 src/main/resources/META-INF 中的一个资源文件

<resources>
    <Resource id="mongoUri" class-name="com.mongodb.MongoClientURI" constructor="uri">
    uri  mongodb://localhost/ironman
    </Resource>
</resources>

还有一个简单的 Junit @RunWith(WeldJUnit4Runner.class)

public class MongoDBProducerTest {
    @Inject
    DB mongoDb;

    @Test
    public void runSampleTest() {
        assertEquals(mongoDb.collectionExists("jobs"), true);
    }
}

得到以下错误: org.jboss.weld.exceptions.WeldException: WELD-000049: 无法调用 public void test.dingo.query.db.util.MongoDBProducer.init() 在 test.dingo.query.db.util 上抛出 java.net.UnknownHostException .MongoDBProducer@a1cdc6d

使用焊接

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.8.Final</version>
</dependency>

WeldContext 和 WeldJUnit4Runner 来自这里 - http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/

【问题讨论】:

  • 您的资源文件由您部署到的容器处理,如果我不得不猜测的话是 Tomcat。 CDI 不直接处理资源注入。

标签: java junit cdi weld


【解决方案1】:

如果您希望在单元测试中处理@Resource,也许您可​​以查看ejb-cdi-unit,它在 Weld-SE 中运行测试并提供一个 CDI 扩展,用 @Inject 替换 @Resource,以便您可以在测试中定义要注入的 CDI-Alternative。

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 2017-10-25
    • 2011-09-08
    • 2013-04-30
    • 1970-01-01
    • 2014-02-28
    • 2018-02-14
    • 2013-04-26
    相关资源
    最近更新 更多