2016-05-05 3 views
0

Я тестирую свое веб-приложение с помощью junit и mockito (для бизнес-уровня).тестирование с помощью Mockito java.lang.nullpointerexception

я есть сущность:

@Entity 
@Table(name = "brand") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Brand.findAll", query = "SELECT b FROM Brand b"), 
    @NamedQuery(name = "Brand.findByOid", query = "SELECT b FROM Brand b WHERE b.oid = :oid"), 
    @NamedQuery(name = "Brand.findByName", query = "SELECT b FROM Brand b WHERE b.name = :name")}) 
public class Brand implements Serializable { 
... 

и сессионный компонент

@Stateless 
public class BrandFacade extends AbstractFacade<Brand> { 

    @PersistenceContext(unitName = "MyWheelJSFPU") 
    private EntityManager em; 

    public void setEm(EntityManager em) { 
     this.em = em; 
    } 

    ... 
    @Override 
    public List<Brand> findAll(){ 
     return em.createNamedQuery("Brand.findAll", Brand.class).getResultList(); 
    } 
    ... 

Теперь я хочу, чтобы проверить .findAll

public class BrandFacadeTest { 

    @Mock 
    private EntityManager mockedEntityManager; 
    @Mock 
    private TypedQuery mockedQuery; 
    private BrandFacade brandFacade; 

    public BrandFacadeTest() { 
    } 

    @BeforeClass 
    public static void setUpClass() { 
     System.out.println("Start BrandFacadeTest"); 
    } 

    @AfterClass 
    public static void tearDownClass() { 
    } 

    @Before 
    public void initDependencies() { 
     brandFacade=new BrandFacade(); 
     brandFacade.setEm(mockedEntityManager); 
     System.out.println("mockEmCreated"); 
    } 

    /** 
    * Test of findAll method, of class BrandFacade. 
    */ 
    @Test 
    public void testFindAll() { 
     System.out.println("findAll"); 
     List<Brand> brands=new ArrayList<>(); 

     when(mockedEntityManager.createNamedQuery("Brand.findAll", Brand.class)).thenReturn(mockedQuery); 
     when(mockedQuery.getResultList()).thenReturn(brands); 
     int initNumber=brandFacade.findAll().size(); 

     //creating Brand 
     Brand b1 = new Brand(1, "mo"); 
     brandFacade.create(b1); 
     verify(mockedEntityManager, times(1)).persist(any()); 

     brands.add(b1); 
     assertEquals("error",initNumber+1, brandFacade.findAll().size()); 
    } 
    ... 

на этой линии

when(mockedEntityManager.createNamedQuery("Brand.findAll", Brand.class)).thenReturn(mockedQuery); 

возвращает java.lang.nullpointerexception ... почему ??? в чем проблема?

Я сделал то же самое для другого объекта, и он работает!

ответ

1

Если вы хотите использовать @Mock аннотацию, вы должны запустить UnitTest либо с MockitoJUnitRunner, или установить следующее в тестовом случае условие @Before:

MockitoAnnotations.initMocks(BrandFacadeTest); 

Смотрите здесь: http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Mockito.html#mock_annotation

+0

OMG мне очень жаль ... я сделал это в другом классе тестов ... это действительно глупая ошибка ... thk u very much – Marco

+0

Thats ok его легко пропустить :) – mdewit