Springboot项目使用TestNG框架进行单元测试

本文介绍了如何在Springboot项目中使用TestNG框架进行单元测试,包括添加TestNG依赖、编写测试代码(如CoreSpringBootStartUp、BaseTest和OrderServiceTest),并详细讨论了mock失效的问题及解决方案。
摘要由CSDN通过智能技术生成

Springboot项目使用TestNG框架进行单元测试

1、前言

 TestNG包含了Junit4的核心功能,并且可以配合其他软件进行集成测试,功能十分强大,所以选择TestNG进行单元测试。
 TestNG和Junit的区别可参考该文章https://blog.csdn.net/weixin_30808253/article/details/96516421

2、添加依赖

在SpringBoot项目的pom文件中添加依赖:

        <!-- testng -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.1.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.10</version>
        </dependency>

3、测试代码编写

文件结构如下图:
在这里插入图片描述

3.1 CoreSpringBootStartUp文件

@EnableAsync
@EnableScheduling
@ServletComponentScan
@EnableAutoConfiguration
@SpringBootApplication(scanBasePackages = {"com.baidu"})
public class CoreSpringBootStartUp {
    public static void main(String[] args) {
        SpringApplication sa = new SpringApplication(CoreSpringBootStartUp.class);
        sa.run(args);
    }
}

3.2 BaseTest文件

所有的测试文件需继承BaseTest

@SpringBootTest(classes = CoreSpringBootStartUp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = CoreSpringBootStartUp.class)
public class BaseTest extends AbstractTransactionalTestNGSpringContextTests {

}

3.3 OrderServiceTest

 测试OrderService中的方法

public class OrderServiceTest extends BaseTest {

	@Autowired
	@Qualifier("orderServiceImpl") //若orderService有多个实现,则需指定具体的实现
    private OrderService orderService;

	@Test(description = "测试的方法描述")
	public void getOrderByIdTest() {
		Order order = orderService.getOrderById(1L);
		// 比较实际值是否是自己期望的值
		Assert.assertEquals(order.getId(), 1L);
	}

}

 若要测试的方法中调用了其他service的方法,比如userService.getUserById(),这时候可以使用mock,示例如下

public class OrderServiceTest extends BaseTest {

	@Autowired 
	@Qualifier("orderServiceImpl") //若orderService有多个实现,则需指定具体的实现
    @InjectMocks
    private OrderService orderService;
	
	@Mock
	private UserService userService;

    @BeforeMethod
    public void setup() {
    	// 初始化
        MockitoAnnotations.initMocks(this);
    }

	@Test(description = "测试的方法描述")
	public void getOrderByIdTest() {
		Mockito.when(userService.getUserById(Mockito.anyLong())).thenReturn(new User());
		
		Order order = orderService.getOrderById(1L);
		// 比较实际值是否是自己期望的值
		Assert.assertEquals(order.getId(), 1L);
	}

}

4、 问题与解决

4.1 mock失效

  1. 查看@Mock和@InjectMocks注解以及初始化方法是否添加
  2. 还有种可能如下,方法getUserById(Mockito.anyLong())需要传入的是Long类型数据,若传null会导致无效
Mockito.when(userService.getUserById(Mockito.anyLong())).thenReturn(new User());

5、参考文献

  1. https://blog.csdn.net/weixin_30808253/article/details/96516421
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值