Java 测试@Transactional service方法JUnit-无数据库

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:

我想为一个服务方法编写一个单元测试,该服务方法被注释为@Transactional,并对Dao层进行调用,Dao层创建基于hibernate标准的查询。 在执行测试时,我得到以下与事务相关的异常

     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创建一个模拟,自己实例化服务。然后做测试。