JUnit4 & TestNG 與 Spring 整合

最近因爲項目須要,開始學習單元測試。可是卡在了測試框架與 Spring 整合的地方,無法啓動 Spring 容器,致使測試類中使用的 bean 沒法自動注入。查了不少資料,最後把 JUnit4TestNG 與 Spring 整合的問題都解決了。php

前置準備

引入 jar 包

咱們須要掃描類,須要 spring-contextjava

Spring 須要與測試框架整合,因此須要 spring-testspring

使用 JUnit4 測試時,須要引入 junitapache

使用 TestNG 時,須要引入 testngapp

完整的 pom.xml 文件內容以下:框架

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zcl</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.6.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.6.RELEASE</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.14.3</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

</project>
複製代碼

建立待測試方法

新建一個類 Greetingmaven

package com.zcl;

import org.springframework.stereotype.Component;

/** * @author: changle * @time: 2019-06-18 05:16 */
@Component
public class Greeting {

    public void sayHello() {
        System.out.println("你好呀");
    }

}
複製代碼

類中只包含一個簡單的方法,咱們用這個方法進行測試。單元測試

建立 Spring 配置文件

resources 文件夾下建立 applicationContext.xml 文件學習

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <context:component-scan base-package="com.zcl"/>

</beans>
複製代碼

只添加包掃描就好了。測試

JUnit4

在 IDEA ,咱們在類名上按下 command + shift + t,能夠快捷的在 test 文件夾下建立包名相同的測試類。

建立測試類
這裏還能夠選擇生成一些可能會用到的輔助方法。在 Testing library 中能夠選擇用到的測試框架,很是的方便。

咱們在生成的類的基礎上編寫一個簡單的測試方法並添加可以整合 Spring 的一些配置。

package com.zcl;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/** * @author: changle * @time: 2019-06-18 05:19 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class GreetingTest extends AbstractJUnit4SpringContextTests {

    @Autowired
    private Greeting greeting;

    @Test
    public void testSayHello() {
        System.out.println("JUnit4 測試開始");
        greeting.sayHello();
        System.out.println("JUnit4 測試結束");
    }
}
複製代碼

首先是 @RunWith 註解,JUnit 用例都是在 Runner(運行器)中執行的。經過這個註解,咱們能夠爲測試類指定咱們須要的 Runner,由於是和 Spring 整合,因此選擇 SpringJUnit4ClassRunner

接下來是 @ContextConfiguration。 這個註解會加載咱們填入的文件,以便注入須要使用的 bean。

咱們的類繼承了 Spring 提供的 AbstractJUnit4SpringContextTests 這個接口,用於獲取 Application Context

運行測試用例,最後獲得的結果如圖所示:

JUnit4 結果

TestNG

依然是建立測試用例,與 JUnit 的區別只是獲取Application Context的方式不一樣。

package com.zcl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;

/** * @author: changle * @time: 2019-06-18 05:45 */
@ContextConfiguration("classpath:applicationContext.xml")
public class GreetingTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private Greeting greeting;

    @Test
    public void testSayHello() {
        System.out.println("TestNG 測試開始");
        greeting.sayHello();
        System.out.println("TestNG 測試結束");
    }
}
複製代碼

一樣有采用 @ContextConfiguration 來引入 Spring 配置文件。

TestNG 再也不須要加入 Runner

測試類繼承的是 AbstractTestNGSpringContextTests,這樣才能夠訪問到Application Context

運行測試用例,獲得的結果以下圖

TestNG 測試用例

總結

其實這兩種框架與 Spring 集成須要的配置差很少,學會了測試框架與 Spring 集成以後,咱們就能夠方便地寫單元測試了。 這兩個測試框架都還支持不少種類的測試,以後會繼續分享它們的其餘功能的使用案例。

相關文章
相關標籤/搜索