SpringBoot使用Junit單元測試
SpringBoot + mybatis
開發工具:IntelliJ IDEA
1.pom.xml
一般使用idea新建一個SpringBoot web專案時,一般都會自動引入此依賴,如果沒有,請手動引入。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.測試類基類
新建的專案,一般會有test包和test類,結構如下:
如果沒有,我們自己建立一個,由於一個專案中我們會寫很多很多測試類,而測試類上面是需要以下幾個註解的,每建一個類都去補註解,太麻煩,我們就在這個類中加上註解,其他測試類直接繼承這個類就好了:
package com.alibaba;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringRunner.class)
//需要指定啟動類,否則會報錯
@SpringBootTest(classes = AmroApplication.class,webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
//由於是Web專案,Junit需要模擬ServletContext,因此我們需要給我們的測試類加上@WebAppConfiguration。
@WebAppConfiguration
public class TmallApplicationTests {
@Before
public void init() {
System.out.println("開始測試-----------------");
}
@After
public void after() {
System.out.println("測試結束-----------------");
}
}
3.controller,service,dao等,省略,就是普通方法,普通介面
4.測試類
我這裡建一個測試類,繼承基類,然後測試我service中的兩個方法
package com.alibaba;
import com.alibaba.service.EntFileService;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Created by lightClouds917
* Date 2018/2/2
* Description:測試類
*/
public class EntFileTest extends TmallApplicationTests {
@Autowired
private EntFileService entFileService;
//@Ignore("not ready yet")
@Test
public void testGetEntFileById(){
Assert.assertSame("企業數量有誤",500,entFileService.getCount());
}
@Test
public void testGetEntFileList(){
Assert.assertSame("企業數量不為10",10,entFileService.getEntFileList());
}
}
如上,直接@Autowired引入你想測試的類就好,然後繼承基類,測試方法上面要加@Test註解。
然後,第一個測試方法:我想測試一下企業數量是不是600,引數意義:
第一個引數:如果測試不通過,會丟擲此訊息,此引數可不要;
第二個引數:我預期的值,我這裡希望他查出來的結果是600;
第三個引數:是實際的結果,就是我們呼叫方法返回的結果;
我們可以看一下Assert類的原始碼:
/**
* Asserts that two objects refer to the same object. If they are not, an
* {@link AssertionError} is thrown with the given message.
*
* @param message the identifying message for the {@link AssertionError} (<code>null</code>
* okay)
* @param expected the expected object
* @param actual the object to compare to <code>expected</code>
*/
static public void assertSame(String message, Object expected, Object actual) {
if (expected == actual) {
return;
}
failNotSame(message, expected, actual);
}
/**
* Asserts that two objects refer to the same object. If they are not the
* same, an {@link AssertionError} without a message is thrown.
*
* @param expected the expected object
* @param actual the object to compare to <code>expected</code>
*/
static public void assertSame(Object expected, Object actual) {
assertSame(null, expected, actual);
}
5.執行測試用例
執行有兩種方法:
1.選中方法,右鍵,然後run 。。。;
2.點選方法前的小標;
具體操作如下截圖:
現在看執行結果,如下圖:
區塊一:這裡是測試用例的執行結果,由於未獲得預期結果,打印出了我們提前設定的錯誤資訊。
區塊二:這是測試用例的覆蓋率,類的覆蓋,方法的覆蓋,行數的覆蓋,非常詳細。
區塊三:此區塊是預期結果和實際結果的詳細對比,點選後才會顯示,如圖點選位置。
關於Assert中,還有很多斷言方法,方法名字很規範,看名字就知道怎麼用了,這裡不再過多說明。
6.打包測試
專案開發完後,我們寫了100個測試用例類,我不能每個類都點選進去,然後慢慢執行,SpringBoot提供了打包測試的方式:我們用一個類,把所有的測試類整理進去,然後直接執行這個類,所有的測試類都會執行。
我這裡建了兩個測試類,分別是EntFileTest,EntFileTest2,現在我打包進TestSuits,讓他們一次執行:
@Suite.SuiteClasses({EntFileTest.class,EntFileTest2.class})
打包完整程式碼:
package com.alibaba;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
/**
* Created by lightClouds917
* Date 2018/2/2
* Description:打包測試
*/
//@Ignore("not ready yet")
@RunWith(Suite.class)
@Suite.SuiteClasses({EntFileTest.class,EntFileTest2.class})
public class TestSuits {
//不用寫程式碼,只需要註解即可
}
7.忽略方法
當我一個測試類寫了10個測試方法時,其中有1個我暫時不想測,想跳過,但是其他9個我想一次執行,怎麼辦?這裡有一個忽略註解,寫在方法上,可以忽略這個測試方法,寫在類上,可以忽略這個類。
package com.alibaba;
import com.alibaba.service.EntFileService;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Created by lightClouds917
* Date 2018/2/2
* Description:測試類
*/
public class EntFileTest extends TmallApplicationTests {
@Autowired
private EntFileService entFileService;
@Ignore("not ready yet")
@Test
public void testGetEntFileById(){
Assert.assertSame("企業數量有誤",600,entFileService.getCount());
}
@Test
public void testGetEntFileList(){
Assert.assertSame("企業數量不為10",10,entFileService.getEntFileList());
}
}
此時,執行這個測試類,testGetEntFileById()方法就會忽略執行。
---------------------
作者:lightClouds917
來源:CSDN
原文:https://blog.csdn.net/weixin_39800144/article/details/79241620
版權宣告:本文為博主原創文章,轉載請附上博文連結!