使用 Mockito 进行测试 java.lang.nullpointerexception
testing with Mockito java.lang.nullpointerexception
我正在使用 junit 和 mockito(用于业务层)测试我的网络应用程序。
我有一个实体:
@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 {
...
和一个会话 bean
@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);
它returns一个java.lang.nullpointerexception...为什么???有什么问题吗?
我为另一个实体制作了完全相同的东西并且它有效!
如果您想使用 @Mock 注释,您必须 运行 使用 MockitoJUnitRunner 进行单元测试,或者在您的测试用例 @Before 子句中设置以下内容:
MockitoAnnotations.initMocks(BrandFacadeTest);
看这里:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Mockito.html#mock_annotation
我正在使用 junit 和 mockito(用于业务层)测试我的网络应用程序。
我有一个实体:
@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 {
...
和一个会话 bean
@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);
它returns一个java.lang.nullpointerexception...为什么???有什么问题吗?
我为另一个实体制作了完全相同的东西并且它有效!
如果您想使用 @Mock 注释,您必须 运行 使用 MockitoJUnitRunner 进行单元测试,或者在您的测试用例 @Before 子句中设置以下内容:
MockitoAnnotations.initMocks(BrandFacadeTest);
看这里:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Mockito.html#mock_annotation