簡體   English   中英

單元測試:@Inject不注入服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM