【问题标题】:Testing @Transactional service method JUnit - without database测试 @Transactional 服务方法 JUnit - 没有数据库
【发布时间】:2020-10-07 07:43:58
【问题描述】:

我想为一个带有 @Transactional 注释的服务方法编写一个单元测试,它调用了创建基于休眠条件的查询的 Dao 层。 执行测试时,我收到以下与事务相关的异常。

     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
    }

}

如何解决这个问题?

【问题讨论】:

  • 这不是您正在编写的单元测试,而是集成测试。如果要进行单元测试,请删除 @SpringBootTest@RunWith。自己为 dao 创建一个 mock 并自己实例化服务。然后进行测试。

标签: java spring-boot hibernate junit service


【解决方案1】:

你可以这样写一个单元测试:

@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
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多