数据无法从db - mockito获取

时间:2016-04-20 12:41:38

标签: java junit mockito

我正在使用Mockito框架进行jUnit测试。 我无法从数据库中获取数据。从db中获取null或empty。不知道如何模拟entityManager。

public class AppServiceTest  {

    @Mock
    private EntityManager entityManager;    
    @Mock 
    DataSource mockDataSource;
    @Mock 
    Connection mockConn;
    @Mock 
    PreparedStatement mockPreparedStmnt;
    @Mock 
    ResultSet mockResultSet;    
    @Mock
    private Query query;

    @Test
    public void testGetAllDc() throws NamingException {        

        AppDataService appDataService  = Mockito.mock(AppDataService.class); 
        List<String> customResults = new ArrayList<String>();
        //customResults = ....
        System.out.println("**RESULTS**"+appDataService.getAllDc());              // here it is printed as []
        Mockito.when(appDataService.getAllDc()).thenReturn(customResults);
        }
    }

AppDataService.java:

@Stateless
public class AppDataService{

   @PersistenceContext
   EntityManager entityManager;

     public List<Object> getAllDc() {
       try {
         Query query = entityManager.createQuery("myQuery");
         List<String> allDc= query.getResultList();
         }
         //......   
   }

更新: 观察到可以将entityManager的模拟值检测为Mock for EntityManager, hashCode: 5425710。但是entityManager.getCriteriaBuilder()或其他entityManager.get....()在AppDataService类中变为null。

2 个答案:

答案 0 :(得分:2)

在测试中,您创建了一个模拟map.fitBounds(bounds);

为了测试此课程,您一定不能嘲笑它。可以使用AppDataService appDataService = Mockito.mock(AppDataService.class);创建它,也可以让mockito为您执行此操作(new AppDataService()

要初始化模拟或被测试类,您可以使用注释并使用mockito runner来执行此操作:

@InjectMocks

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {

   @InjectMock
   private AppService appService;

   @Mock
   private EntityManager entityManager;

此外,您模拟了entitymanager,因此它的所有方法都是存根的,并且在任何方法调用中默认情况下都不返回任何值(null)。

如果您期望@Before public void setup() { MockitoAnnotations.initMocks(this); } 调用返回某些内容,则应在设置方法中模拟创建/注入后正确存根。

createQuery("myQuery")

如果模拟返回的内容并不重要,只要它不为空,你可以使用

来初始化模拟。
@Before
public void setup() {
  //... 
  when(entityManager.createQuery(eq("myQuery"))).thenReturn(query); 
  //OR
  when(entityManager.createQuery(anyString())).thenReturn(query) 

所以整个测试看起来应该是

@Mock(answer = Answers.RETURNS_DEEP_STUBS)) //OR @Mock(answer = Answers.RETURNS_MOCKS)
private EntityManager entityManager;

答案 1 :(得分:1)

如果要测试它,则无需模拟appDataService。该字段应使用@InjectMocks进行注释。

@InjectMocks
private AppDataService appDataService = new AppDataService();

您需要模拟的是entityManager.createQueryquery.getResultList方法。

Query queryMock = mock(Query.class);
when(entityManager.createQuery(anyString())).thenReturn(queryMock);
when(query.getResultList()).thenReturn(customResults);

之后,您可以在测试中致电appDataService.getAllDc()并检查结果。