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