使用Spock 1.2简化对遗留应用程序的集成测试
了解如何利用Spock 1.2切片傳統(tǒng)應(yīng)用程序的Spring上下文,編寫集成測試。
您是否曾經(jīng)想過,要開始使用一些遺留應(yīng)用程序,編寫一些測試以了解正在發(fā)生的事情,并可能收到有關(guān)回歸的通知? 當(dāng)您想實例化單個類時,這種感覺會因NullPointerException而失敗。 6替換(有困難)依賴項之后,您以前從未聽說過的類仍然存在一些錯誤。 聽起來很熟悉?
有多種技術(shù)可以處理隱藏的依賴項。 有整本專門的書(可能還有幾本我還沒讀過)。 有時,從集成測試開始并執(zhí)行某些過程可能是可行的。 即使只是在我們的情況下完全不需要,查看僅設(shè)置上下文所需的奇特組件可能更為“有趣”。 謝謝(太寬和粗心使用) @ComponentScan :)。
在測試環(huán)境中注入存根/模擬是一種作為緊急援助的方式(請參閱最后一段,有更好但更難的方法)。 對于想要在其上進行切割的每個依賴項(或?qū)嵗拿總€不需要的bean),可以使用帶有@Primary批注的額外bean定義(通常是在進行此操作之前要三思而后行)的“ bean”定義來“手動”實現(xiàn)。順便說說)。 @MockBean放在測試中的某個字段上更方便,但是仍然需要在我們的測試中定義一個字段并在其上添加注釋(5?10?15 bean?)。 Spock 1.2引入了一些@StubBeans功能, @StubBeans在這里可能有用。
它可以用來簡單地提供一個類列表,這些類(可能)應(yīng)在Spring測試上下文中用存根替換。 當(dāng)然,在實例化實際對象之前(例如,防止在構(gòu)造函數(shù)中使用NPE)。 多虧了這幾行存根/模擬注入:
@RunWith(SpringRunner.class) //Spring Boot + Mockito @SpringBootTest //possibly some Spring configuration with @ComponentScan is imported in this legacy application public class BasicPathReportGeneratorInLegacyApplicationITTest { //usual approach@MockBeanprivate KafkaClient kafkaClientMock;@MockBeanprivate FancySelfieEnhancer fancySelfieEnhancerMock;@MockBeanprivate FastTwitterSubscriber fastTwitterSubscriberMock;@MockBeanprivate WaterCoolerWaterLevelAterter waterCoolerWaterLevelAterterMock;@MockBeanprivate NsaSilentNotifier nsaSilentNotifierMock;//a few more - remember, this is legacy application, genuine since 1999 ;)//...@Autowiredprivate ReportGenerator reportGenerator;@Testpublic void shouldGenerateEmptyReportForEmptyInputData() {...} }可以只替換為一(長)行:
@SpringBootTest //possibly some Spring configuration with @ComponentScan is imported in this legacy application @StubBeans([KafkaClient, FancySelfieEnhancer, FastTwitterSubscriber, WaterCoolerWaterLevelAterter, NsaSilentNotifier/(, ... */])//all classes of real beans which should be replaced with stubs class BasicPathReportGeneratorInLegacyApplicationITSpec extends Specification {@Autowiredprivate ReportGenerator reportGeneratordef "should generate empty report for empty input data"() {....} }(使用Spock 1.2-RC2測試)
值得一提的是@StubBeans僅用于提供占位符。 在某種情況下,需要提供存根和/或調(diào)用驗證@SpringBean或@SpringSpy (在Spock 1.2中也引入了)更好。 我在以前的博客文章中寫了更多有關(guān)它的內(nèi)容 。
有一個重要方面要強調(diào) 。 @StubBeans在我們有一些“遺留”項目并希望快速開始編寫集成回歸測試以查看結(jié)果的情況下很方便使用。 但是,正如我的一位同事DarekKaczyński的總結(jié)所概括的那樣,盲目更換在測試中“爆炸”的豆僅僅是“掃除地毯下的問題”。 在初始階段之后,當(dāng)我們開始了解正在發(fā)生的事情時,是重新考慮在生產(chǎn)環(huán)境和測試環(huán)境中創(chuàng)建上下文的好時機。 已經(jīng)提到過的@ComponentScan太寬泛,通常是萬惡之源。 設(shè)置部分上下文并將其放在一起(如果需要)的能力是一個很好的起點。 使用@Profile或條件Bean是測試中非常強大的機制(不僅限于此)。 @TestConfiguration和適當(dāng)?shù)腷ean選擇以改善上下文緩存是值得牢記的。 但是,我從本文開始介紹了Spock中的新機制,該機制在某些情況下可能會有用,并且我想使其簡短。 在集成測試中可能還有另一篇更通用的博客文章,關(guān)于管理Spring上下文。 我必須認真對待它:)。
翻譯自: https://www.javacodegeeks.com/2018/09/integration-testing-legacy-application-spock-1-2.html
總結(jié)
以上是生活随笔為你收集整理的使用Spock 1.2简化对遗留应用程序的集成测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是电脑内存条什么是电脑内存条的金手指
- 下一篇: guava和commons_使用Guav