【Java Web】Spring Boot 單元測試 & JUnit4

https://my.oschina.net/zjllovecode/blog/1605981
https://segmentfault.com/a/1190000010854538
————————————————————————————

Spring Boot 單元測試

標準模版:

@RunWith(SpringRunner.class)
@SpringBootTest

注:
@RunWith(SpringRunner.class)@RunWith(SpringJUnit4ClassRunner.class) 沒區別;
@SpringBootTest 完整寫法:@SpringBootTest(classes = 啓動類.class)
微服務註解:@WebAppConfiguration 可省略;

SpringRunner和SpringJUnit4ClassRunner有什麼區別?
在使用所有註釋前必須使用;
SpringRunner 繼承了 SpringJUnit4ClassRunner,沒有擴展任何功能,兩者沒區別,前者名字更簡短而已;

@RunWith(SpringJUnit4ClassRunner.class) // 讓測試運行於spring測試環境
@RunWith(SpringRunner.class)
@ContextConfiguration(locations = {"classpath:/com/security/resource/spring/context/application/applicationContext.xml"} , loader = GenericXmlContextLoader.class)

//【@ContextConfiguration 用來指定加載的Spring配置文件的位置,會加載默認配置文件,

@ContextConfiguration 註解有以下兩個常用的屬性:locations:可以通過該屬性手工指定 Spring 配置文件所在的位置,可以指定一個或多個 Spring 配置文件用,分開。如下所示: @ContextConfiguration(locations={“aa/aa.xml”,” aa/bb.xml”})

inheritLocations:是否要繼承父測試用例類中的 Spring 配置文件,默認爲 true。】

@DirtiesContext(classMode = ClassMode.AFTER_CLASS) //@DirtiesContext 在測試方法上出現這個註解時,表明底層Spring容器在該方法的執行中被“污染”,從而必須在方法執行結束後重新創建(無論該測試是否通過)。

@TransactionConfiguration( transactionManager = “transactionManager” , defaultRollback = false) //【@TransactionConfiguration 爲配置事務性測試定義了類級別的元數據。PlatformTransactionManager默認的實例叫transactionManager, 如果需要的PlatformTransactionManager不是“transactionManager”的話,那麼可以顯式配置驅動事務的PlatformTransactionManager的bean的名字。此外, 可以將defaultRollback標誌改爲false,表示不回滾。通常, @TransactionConfiguration與@ContextConfiguration搭配使用。

@ContextConfiguration
@TransactionConfiguration(transactionManager=“transactionManager”, defaultRollback=false)】

@Transactional //開啓類級別的事物
public class TestSecurityPermissionService {

//註解生成SecurityPermissionI 的代理
@Autowired
SecurityPermissionI securityPermissionI;

POM

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

測試類需要兩個註解:

1.要讓一個普通類變成一個單元測試類只需要在類名上加入 @SpringBootTest@RunWith(SpringRunner.class) 兩個註釋即可;

2.在測試方法上加上 @Test 註釋;
——————

  • @SpringBootTest
@SpringBootTest(classes = {SponsorTestApp.class},
        webEnvironment = SpringBootTest.WebEnvironment.NONE)

@SpringBootTest的webEnvironment屬性來進一步優化測試的運行方式:

MOCK : 加載一個WebApplicationContext並提供一個模擬servlet環境;
嵌入式servlet容器在使用此註釋時不會啓動。如果servlet API不在你的類路徑上,這個模式將透明地回退到創建一個常規的非web應用程序上下文。可以與@AutoConfigureMockMvc結合使用,用於基於MockMvc的應用程序測試。
RANDOM_PORT : 加載一個EmbeddedWebApplicationContext並提供一個真正的servlet環境;
嵌入式servlet容器啓動並在隨機端口上偵聽。
DEFINED_PORT : 加載一個EmbeddedWebApplicationContext並提供一個真正的servlet環境。嵌入式servlet容器啓動並監聽定義的端口(即從application.properties或默認端口8080)。
NONE : 使用SpringApplication加載ApplicationContext,但不提供任何servlet環境(模擬或其他)。
——————

  • @RunWith(SpringRunner.class)(配置的類是固定寫法)
    (Spring 1.4之前是@ContextConfiguration

——————

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringbootStarterTests {
    //
}
@SpringBootTest(classes = {SponsorTestApp.class},
        webEnvironment = SpringBootTest.WebEnvironment.NONE)
  • 提問:什麼是單元測試?
    寫了個類,要給別人看,會不會有bug?不知道,測試一下;
    寫main方法?不好!如果方法多的話,一個main方法不能搞定;
    1.因爲不能一起運行;
    2.大多數情況下需要認爲觀察輸出是否正確;

  • 提問:爲什麼要單元測試?
    重視測試,應付將來的實現的變化;
    提高士氣,明確知道我的東西是沒問題的;
    JUnit使用斷言,給結果可預期性;

https://www.cnblogs.com/javastack/p/9150408.html

————————————————————————————

JUnit 4

註解的執行順序:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass
一般只會用到:@Before -> @Test -> @After

  • 備註:
    JUnit3中所有方法都要用@Test修飾;

在這裏插入圖片描述
————————————————————————————
————————————————————————————
————————————————————————————
————————————————————————————
————————————————————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章