mockito+testng Mock Redis

本文档展示了如何使用Mockito框架配合TestNG进行单元测试,具体以RedisDAO为例,模拟JedisPool和Jedis客户端的交互。测试中初始化Mockito注解,通过Mockito模拟getJedisPool和getClient方法,确保在没有真实Redis环境的情况下也能完成测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package yy.xx.redis;

 

import org.apache.log4j.Logger;

import org.springframework.stereotype.Repository;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

 

 

@Repository

public class RedisDAO {

  private static final Logger logger = Logger.getLogger(RedisDAO.class);

  

  private JedisPool jedisPool;

  

  public JedisPool getJedisPool() {

    return jedisPool;

  }

 

  public void setJedisPool(JedisPool jedisPool) {

    this.jedisPool = jedisPool;

  }

 

  public Jedis getClient() {

    Jedis redisClient = jedisPool.getResource();

    if(redisClient == null){

      return redisClient;

    }

    if (!redisClient.isConnected()) {

      redisClient.connect();

      logger.debug("redisClient is on connect");

    }

    return redisClient;

  }

 

  public void closeClient(Jedis client) {

    if (client != null)

      jedisPool.returnResource(client);

    logger.debug("redisClient is return resource");

  }

}

 

 

 

package yy.xx.redis;

 

import org.mockito.InjectMocks;

import org.mockito.Mock;

import org.mockito.Mockito;

import org.mockito.MockitoAnnotations;

import org.testng.Assert;

import org.testng.annotations.Test;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

 

public class RedisDAOTest {

  @InjectMocks//有实际方法调用时用,比如set了想看GET

  private RedisDAO dao;

  

  private final Jedis redisClient = Mockito.mock(Jedis.class); 

  private final JedisPool jedisPool = Mockito.mock(JedisPool.class); 

  

  @Test

  public void test() {

    MockitoAnnotations.initMocks(this);

 

    Assert.assertNotNull(dao);

    dao.setJedisPool(jedisPool);

    Assert.assertNotNull(dao.getJedisPool());

 

    Mockito.when(dao.getClient()).thenReturn(redisClient);

    Assert.assertNotNull(dao.getClient());

    

    dao.closeClient(redisClient);  

  }

}

 

### Java后端开发全流程详解 #### 1. 编码阶段 Java后端开发的编码阶段主要涉及业务逻辑实现、框架选择和代码质量保障。常用的Java后端框架包括Spring Boot、Spring MVC、MyBatis等。 - **框架选择**:Spring Boot因其内置的自动配置功能,能够快速搭建项目并集成数据库、缓存等组件,成为主流选择。 - **代码规范**:团队需制定统一的编码规范(如Google Java Style Guide),并通过静态代码检查工具(如Checkstyle、SonarQube)确保代码质量。 - **单元测试**:使用JUnit或TestNG进行单元测试,结合Mockito模拟依赖对象,保证代码的可测试性。 ```java @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; @Test public void testGetUserById() { User user = userService.getUserById(1); assertNotNull(user); } } ``` #### 2. 数据库设计与交互 数据库是后端开发的核心部分之一,主要包括数据库选型、表结构设计和数据访问层实现。 - **数据库选型**:根据业务需求选择合适的数据库类型,如关系型数据库(MySQL、PostgreSQL)或NoSQL数据库(MongoDB、Redis)。 - **表结构设计**:遵循第三范式(3NF)设计表结构,同时考虑性能优化需求,适当引入冗余字段。 - **ORM框架**:使用MyBatis或Hibernate简化SQL操作,降低开发复杂度。 ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByEmail(String email); } ``` #### 3. 服务器配置 服务器配置涉及应用部署环境的搭建和性能调优。 - **应用服务器**:Tomcat、Jetty或更高效的Nginx+ Undertow组合常用于生产环境。 - **负载均衡**:通过Nginx或HAProxy实现请求分发,提升系统并发能力。 - **性能监控**:利用Prometheus、Grafana等工具实时监控服务器资源使用情况,及时发现潜在问题。 #### 4. 团队成员分工 在Java后端开发中,团队成员通常按以下角色分工: - **架构师**:负责系统整体设计,包括技术选型、接口规范和性能优化策略。 - **开发工程师**:专注于业务逻辑实现,编写高质量代码,并参与单元测试。 - **测试工程师**:设计测试用例,执行功能测试、性能测试和安全测试。 - **运维工程师**:负责服务器部署、监控和故障排查,确保系统稳定运行。 #### 5. 后端与前端开发协作方式 后端与前端开发的协作主要依赖API接口的设计和文档化。 - **接口设计**:采用RESTful风格设计API,明确请求方法(GET、POST、PUT、DELETE)、参数格式和返回值结构。 - **接口文档**:使用Swagger生成API文档,便于前后端沟通和测试。 - **联调流程**:通过Mock服务模拟后端接口,使前端能够在后端开发完成前进行独立开发;待后端接口就绪后,双方共同进行联调测试。 ```yaml # Swagger API 示例 swagger: "2.0" info: version: "1.0.0" title: User API paths: /users/{id}: get: summary: Get user by ID parameters: - name: id in: path required: true type: integer responses: "200": description: Successful response schema: $ref: "#/definitions/User" definitions: User: type: object properties: id: type: integer name: type: string ``` 解释上面每行代码
最新发布
06-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值