如何使用 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 它们。如果是的话,我 运行 对它们进行集成测试。
我不知道如何为以下 类 编写测试,尤其是控制器和模型。是否可以使用 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 它们。如果是的话,我 运行 对它们进行集成测试。