Springboot项目使用TestNG框架进行单元测试
Springboot项目使用TestNG框架进行单元测试
1、前言
TestNG包含了Junit4的核心功能,并且可以配合其他软件进行集成测试,功能十分强大,所以选择TestNG进行单元测试。 TestNG和Junit的区别可参考该文章
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());
5、参考文献
上一篇:
5款热门的远程控制软件,让你事半功倍
下一篇:
测试人员需要具备哪些基本技能