如何使用jUnit在JSF项目中测试Controller和Model?

时间:2017-02-07 15:11:55

标签: jsf junit model controller ejb

我不知道如何为这些后续类编写测试,特别是对于Controller和Model。是否可以使用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();
    }
}
&#13;
&#13;
&#13;

Model.class

&#13;
&#13;
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;
    }
}
&#13;
&#13;
&#13;

和DB.class

&#13;
&#13;
@Stateless
public class DB {

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

1 个答案:

答案 0 :(得分:0)

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的存储库类...我通常不对它们进行单元测试。如果是这样我就对它们进行集成测试。