2017-02-07 26 views
1

Я точно не знаю, как писать тесты для этих следующих классов, особенно для контроллера и модели. Можно ли тестировать с помощью jUnit? Я слышал от Selenium, но сначала я проверил бы с jUnit. Спасибо за помощь и с наилучшими пожеланиями.Как проверить контроллер и модель в проекте JSF с помощью 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); 
 
    }

+0

Вы хотите иметь единичные или интеграционные тесты? –

+0

только модульные тесты – Benimo

+0

Используйте arquillian с jsfunit. Путь проще, поскольку вы используете реальный контейнер и не нуждаетесь в том, чтобы высмеивать все, что вам не нужно/нужно издеваться – Kukeltje

ответ

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-подобных классов репозитория .. я обычно не блок-тестирования их. ЕСЛИ так я запускаю тесты интеграции на них.