Java 测试@Transactional service方法JUnit-无数据库
我想为一个服务方法编写一个单元测试,该服务方法被注释为@Transactional,并对Dao层进行调用,Dao层创建基于hibernate标准的查询。 在执行测试时,我得到以下与事务相关的异常Java 测试@Transactional service方法JUnit-无数据库,java,spring-boot,hibernate,junit,service,Java,Spring Boot,Hibernate,Junit,Service,我想为一个服务方法编写一个单元测试,该服务方法被注释为@Transactional,并对Dao层进行调用,Dao层创建基于hibernate标准的查询。 在执行测试时,我得到以下与事务相关的异常 org.springframework.transaction.CannotCreateTransactionException Caused by: javax.persistence.PersistenceException Caused by:
org.springframework.transaction.CannotCreateTransactionException
Caused by: javax.persistence.PersistenceException
Caused by: org.hibernate.exception.JDBCConnectionException
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Caused by: java.net.ConnectException
测试类别和服务方法:
//Service class method
@Transactional(readOnly=true)
public List<Object> fetchSomeData() {
sampleDao.fetchSomeData();
//light weight processing code
//return processed list
}
//Test class
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@ActiveProfiles
public class ServiceTest {
@Autowired
private Service service;
@MockBean
private SampleDao sampleDao;
@Test
public void serviceTest() {
when(sampleDao.fetchSomeData()).thenReturn(new ArrayList<Object>());
List<Object> result = service.fetchSomeData();
//Assert processed data returned
}
}
//服务类方法
@事务(只读=真)
公共列表fetchSomeData(){
sampleDao.fetchSomeData();
//轻量级处理代码
//返回已处理列表
}
//测试班
@RunWith(SpringRunner.class)
@春靴测试
@交易的
@活动配置文件
公共类服务测试{
@自动连线
私人服务;
@蚕豆
私人样本道样本道;
@试验
public void serviceTest(){
when(sampleDao.fetchSomeData()).thenReturn(newarraylist());
列表结果=service.fetchSomeData();
//断言返回的已处理数据
}
}
如何更正此问题?您可以编写如下单元测试:
@RunWith(MockitoJUnitRunner .class)
public class ServiceTest {
private Service service;
@Before
public void setUp() {
service = new Service();
}
@Mock
private SampleDao sampleDao;
@Test
public void serviceTest() {
when(sampleDao.fetchSomeData()).thenReturn(new ArrayList<Object>());
List<Object> result = service.fetchSomeData();
//Assert processed data returned
}
}
@RunWith(MockitoJUnitRunner.class)
公共类服务测试{
私人服务;
@以前
公共作废设置(){
服务=新服务();
}
@嘲弄
私人样本道样本道;
@试验
public void serviceTest(){
when(sampleDao.fetchSomeData()).thenReturn(newarraylist());
列表结果=service.fetchSomeData();
//断言返回的已处理数据
}
}
您可以编写如下的单元测试:
@RunWith(MockitoJUnitRunner .class)
public class ServiceTest {
private Service service;
@Before
public void setUp() {
service = new Service();
}
@Mock
private SampleDao sampleDao;
@Test
public void serviceTest() {
when(sampleDao.fetchSomeData()).thenReturn(new ArrayList<Object>());
List<Object> result = service.fetchSomeData();
//Assert processed data returned
}
}
@RunWith(MockitoJUnitRunner.class)
公共类服务测试{
私人服务;
@以前
公共作废设置(){
服务=新服务();
}
@嘲弄
私人样本道样本道;
@试验
public void serviceTest(){
when(sampleDao.fetchSomeData()).thenReturn(newarraylist());
列表结果=service.fetchSomeData();
//断言返回的已处理数据
}
}
这不是您正在编写的单元测试,而是集成测试。如果需要单元测试,请删除@SpringBootTest
和@RunWith
。自己为dao创建一个模拟,自己实例化服务。然后进行测试。这不是您正在编写的单元测试,而是集成测试。如果需要单元测试,请删除@SpringBootTest
和@RunWith
。自己为dao创建一个模拟,自己实例化服务。然后做测试。