[英]Unit Test: @Inject not injecting service
這是我的實體
@Entity
public class User {
@Id
private String id;
private String externalUserId;
private String email;
private String clientId;
private String clientSecret;
private boolean active;
public User(@Nonnull final String externalUserId, @Nonnull final String email,
@Nonnull final String clientId, @Nonnull final String clientSecret, final boolean active) {
id = UUID.randomUUID().toString();
this.externalUserId = externalUserId;
this.email = email;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.active = active;
}
}
和一個UserService
import javax.annotation.Nonnull;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceUnit;
@Stateless
public class UserService {
@PersistenceUnit
private EntityManager entityManager;
@Nonnull
public User createUser(@Nonnull final User user) {
entityManager.persist(user);
return user;
}
}
我也有DBConfig
作為
import javax.annotation.sql.DataSourceDefinition;
import javax.ejb.Stateless;
@DataSourceDefinition(
name = "java:app/oauth/testDB",
className = "org.h2.jdbcx.JdbcDataSource",
url = "jdbc:h2:mem:test"
)
@Stateless
public class DBConfig {
}
test/src/main/resources/persistence.xml
為
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="testDB" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.self.oauth.persistence.entities.User</class>
</persistence-unit>
</persistence>
我的測試看起來像
public class UserTest {
@Inject
private UserService userService;
@Test
public void testUser() {
final User user = new User(UUID.randomUUID().toString(), "test@test.com", "clientId", "clientSecret", true);
userService.createUser(user);
assertTrue(true);
}
}
我在userService
上得到NullPointeException
我想念什么?
注入在執行時由Java EE容器處理。 特別是在檢查您的代碼段時,EJB容器將處理UserService的注入,因為它被聲明為無狀態Bean。 部署整個應用程序時,將設置一個容器,並且注入工作正常。 當執行單元測試(我猜想使用junit)時,不會啟動任何服務,並且任何@Injection最終都會將變量設置為null,因為也不會啟動任何容器。
想法是,單元測試應僅用於獨立於外部代碼(如其他類中的代碼)之外的代碼段進行測試。 但是,在您的情況下,您似乎需要進行集成測試,因此,您確實需要啟動所有服務,因為您要檢查對象是否在數據庫中保持不變。 為此,您還需要啟動一個容器。 一個很好的方法是使用Arquillian 。
例如,在您的情況下,測試應該是這樣的:
package org.arquillian.example;
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 UserTest{
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(UserService.class)
.addClass(User.class)
.addClass(DBConfig.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Inject
private UserService userService;
@Test
public void testUser() {
final User user = new User(UUID.randomUUID().toString(), "test@test.com", "clientId", "clientSecret", true);
userService.createUser(user);
assertTrue(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.