【问题标题】:How to test a Controller and Model in a JSF Project with jUnit?如何使用 jUnit 在 JSF 项目中测试控制器和模型?
【发布时间】:2017-02-07 15:11:55
【问题描述】:

我不确切知道如何为以下这些类编写测试,尤其是对于控制器和模型。是否可以使用 jUnit 进行测试? 我从 Selenium 那里听说过,但首先我会用 jUnit 进行测试。感谢您的帮助和问候。

Controller.class:

import factory.InfoMessageFactory;
import entity.Product;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import model.ProductModel;
import project.Konstanten;

@Named(value = "ProductController")
@SessionScoped
public class ProductController implements Serializable {
   
    private Product product;
    
    @Inject
    private ProductModel model;

    @PostConstruct
    public void init() {
        this.product = new Product();
    }
    
   
    public String addProduct() {
       this.model.newProduct(this.product);
    }

    public Product getProduct() {
        return product;
    }

    public void setProdukt(Product product) {
        this.product = product;
    }
    
    public List<Product> getProducts() {
        return this.model.getProducts();
    }
}

模型类

package model;

import ejb.DB;
import entity.Product;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;

@Dependent
public class ProductModel implements Serializable{
    
    @Inject
    private DB db;
    
    public boolean addProduct(Product p){
        try{
            db.persist(p);
        }catch(Exception e){
            System.out.println("Blablabla");
            return false;                
        }
        return true;
    }
}

还有 DB.class

@Stateless
public class DB {

    @Inject
    @RealClass
    private EntityManager em;
    
    public void persist(Object object) {
        em.persist(object);
    }

【问题讨论】:

  • 您想要进行单元测试或集成测试?
  • 只是单元测试
  • 使用 arquillian 和 jsfunit。由于您使用真正的容器并且不需要模拟您不想/不需要模拟的所有内容,因此更容易

标签: jsf junit model controller ejb


【解决方案1】:

ProductController中,真的没有太多要测试的东西..除非有更多你没有发布的逻辑。

为了测试ProductModel 或任何具有DB 依赖项的类服务类,我建议将项目依赖项添加到其中一个模拟框架(我建议使用Mockito,因为它是所有框架中最成熟的)。

对于addProducts 方法,您最终可能会进行以下测试:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.mockito.MockitoAnnotations;

public class ProductModelTest{

@Mock
private DB dbMock;

@InjectMocks
private ProdcutModel = new ProductModel();

@Before
public void init(){
   MockitoAnnotations.iniMocks(this);
}

@Test
public void shouldReturnTrue_whenEntityPersisted(){
    doNothing().when(dbMock).persist(any(Product.class));

    boolean result = productModel.addProduct(new Product());

    assertTrue(result);
}

@Test
    public void shouldReturnFalse_whenEntityPersisted(){
        doThrow(RuntimeException.class).when(dbMock).persist(any(Product.class));

        boolean result = productModel.addProduct(new Product());

        assertFalse(result);
}
}

关于类似 DB 的存储库类.. 我通常不对它们进行单元测试。如果我对它们进行集成测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多