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
修飾;
————————————————————————————
————————————————————————————
————————————————————————————
————————————————————————————
————————————————————————————