Java 数据可以';t从db-mockito获取

Java 数据可以';t从db-mockito获取,java,junit,mockito,Java,Junit,Mockito,我正在使用Mockito框架进行jUnit测试。 我无法从数据库中获取数据。从数据库中获取null或空。不知道我怎么能嘲笑entityManager public class AppServiceTest { @Mock private EntityManager entityManager; @Mock DataSource mockDataSource; @Mock Connection mockConn; @Mock

我正在使用Mockito框架进行jUnit测试。 我无法从数据库中获取数据。从数据库中获取null或空。不知道我怎么能嘲笑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);
        }
    }
公共类AppServiceTest{
@嘲弄
私人实体管理者实体管理者;
@嘲弄
数据源模拟数据源;
@嘲弄
连接模拟接头;
@嘲弄
已准备好的报表mockPreparedStmnt;
@嘲弄
结果集模拟结果集;
@嘲弄
私有查询;
@试验
public void testGetAllDc()引发NamingException{
AppDataService AppDataService=Mockito.mock(AppDataService.class);
List customResults=new ArrayList();
//自定义结果=。。。。
System.out.println(“**RESULTS**”+appDataService.getAllDc());//此处打印为[]
Mockito.when(appDataService.getAllDc())。然后返回(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();
         }
         //......   
   }
@无状态
公共类AppDataService{
@持久上下文
实体管理器实体管理器;
公共列表getAllDc(){
试一试{
Query Query=entityManager.createQuery(“myQuery”);
List allDc=query.getResultList();
}
//......   
}
更新:
据观察,entityManager的模拟值可以检测为
mock for entityManager,hashCode:5425710
。但是
entityManager.getCriteriaBuilder()
或任何
entityManager.get…)
在AppDataService类中变为null。

在测试中,您创建了一个mock
AppDataService AppDataService=Mockito.mock(AppDataService.class);

为了测试这个类不能模拟它。可以使用
新建AppDataService()
创建它,也可以让mockito为您创建(
@InjectMocks

要初始化mock或测试中的类,可以使用注释并使用mockito运行程序:

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {

   @InjectMock
   private AppService appService;

   @Mock
   private EntityManager entityManager;

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

如果您希望
createQuery(“myQuery”)
调用返回某些内容,那么应该在setup方法中的模拟创建/注入之后正确地将其存根

@Before
public void setup() {
  //... 
  when(entityManager.createQuery(eq("myQuery"))).thenReturn(query); 
  //OR
  when(entityManager.createQuery(anyString())).thenReturn(query) 
如果模拟返回什么并不重要,只要它不为null,您可以使用

@Mock(answer = Answers.RETURNS_DEEP_STUBS)) //OR @Mock(answer = Answers.RETURNS_MOCKS)
private EntityManager entityManager;
所以整个测试应该是这样的

@RunWith(MockitoJunitRunner.class)
public class AppServiceTest  {

  @Mock(answer = Answers.RETURNS_DEEP_STUBS)) 
  private EntityManager entityManager;    
  @Mock
  private Query query;

  ...
  @InjectMocks
  private AppDataService appDataService;

  @Test
  public void testGetAllDc() throws NamingException {        

     //arrange
     List<String> customResults = new ArrayList<String>();
     //TODO populate customResults
     when(entityManager.createQuery("myQuery")).thenReturn(query);
     when(query.getResultList()).thenReturn(customResults);

     //act
     System.out.println("**RESULTS**"+appDataService.getAllDc()); 
@RunWith(MockitoJunitRunner.class)
公共类AppServiceTest{
@Mock(answer=Answers.RETURNS\u DEEP\u STUBS))
私人实体管理者实体管理者;
@嘲弄
私有查询;
...
@注射模拟
私有AppDataService AppDataService;
@试验
public void testGetAllDc()引发NamingException{
//安排
List customResults=new ArrayList();
//TODO填充自定义结果
当(entityManager.createQuery(“myQuery”))。然后返回(query);
当(query.getResultList())。然后返回(customResults);
//表演
System.out.println(“**RESULTS**”+appDataService.getAllDc());

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

@InjectMocks
private AppDataService appDataService = new AppDataService();
您需要模拟的是
entityManager.createQuery
query.getResultList
方法

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

测试结束后,您可以在测试中调用
appDataService.getAllDc()
,并检查结果。

尝试
when(entityManager.createQuery(eq(“myQuery”))。然后返回(查询)
when(entityManager.createQuery(anyString())。然后返回(查询)
如果您使用@InjectMocks和@Mock annotations,请使用
MockitoJUnitRunner
或调用的MockitoAnnotations.initMocks(此)在配置mocksThanks之前。可以观察到,
entityManager
的模拟值可以检测为
mock for entityManager,hashCode:5425710
。但是
entityManager.getCriteriaBuilder()
或任何
entityManager.get…)
AppDataService
类中的
正在变为null。您知道缺少什么吗。或者您必须在(…
方法)时使用
声明要调用的每个方法的行为。您还可以使用深存根(
@mock(answer=Answers.RETURNS\u deep\u stubs)
或mock初始化mock(
@Mock(answer=Answers.RETURNS\u Mock)
),然后只在需要的地方注入特殊行为。是我还是你试图模拟测试中的每个类?这是一个单元测试还是一个集成测试?如果是单元测试,你尝试过DBUnit吗?我是junit新手。我需要测试我的DAO方法。我们是否也需要在测试方法中访问数据库以确保db fetch是wor因此,如果您需要测试DAO方法,请使用DBunit模拟DB。这将比连接真实对象快得多,允许开发团队编写代码并进行测试,而且您也不会依赖外部资源的状态来通过单元测试,这非常有帮助。然后下一步将是int在正确配置的环境中运行的整合测试
正在返回
customResults
中的元素。是的,如果此方法中没有额外的逻辑。@ep预期的行为是什么?您到底想测试什么?我需要测试db fetch/PERSISTER/delete等是否正常工作。我想在单元测试用例中也会发生实际的db命中。在这种情况下,您可以需要集成测试与数据库的实际连接。这里不需要模拟。
Query queryMock = mock(Query.class);
when(entityManager.createQuery(anyString())).thenReturn(queryMock);
when(query.getResultList()).thenReturn(customResults);