Java 数据可以';t从db-mockito获取
我正在使用Mockito框架进行jUnit测试。 我无法从数据库中获取数据。从数据库中获取null或空。不知道我怎么能嘲笑entityManagerJava 数据可以';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
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。在测试中,您创建了一个mockAppDataService 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);