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

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

文章目录

  • Springboot项目使用TestNG框架进行单元测试
    • 1、前言
    • 2、添加依赖
    • 3、测试代码编写
      • 3.1 CoreSpringBootStartUp文件
      • 3.2 BaseTest文件
      • 3.3 OrderServiceTest
    • 4、 问题与解决
      • 4.1 mock失效
    • 5、参考文献

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、测试代码编写

文件结构如下图:
Springboot项目使用TestNG框架进行单元测试_第1张图片

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

你可能感兴趣的:(后端,单元测试,spring,boot,java)