如何使用 jUnit 测试 JSF 项目中的控制器和模型?

How to test a Controller and Model in a JSF Project with jUnit?

我不知道如何为以下 类 编写测试,尤其是控制器和模型。是否可以使用 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();
    }
}

Model.class

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);
    }

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

为了测试 ProductModel 或任何具有 DB 依赖项的 service-like class,我建议向其中一个模拟框架添加项目依赖项(我建议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-like 存储库 classes.. 我通常不会 unit-test 它们。如果是的话,我 运行 对它们进行集成测试。