我正在嘗試測驗像這樣的事件偵聽器
@Component
class EventHandler {
@EventListener
fun handler(event: SomeEvent) { //SomeEvent is has properties source and someObject
...
}
}
我的測驗是這種格式
@SpringBootTest
class SendWelcomeEmailTest {
@Autowired
lateinit var publisher: ApplicationEventPublisher
@Test
fun test(){
val someObject = SomeObject()
val event = SomeEvent(this, someObject)
val listener = mockkClass(EventHandler::class)
publisher.publishEvent(event)
verify { listener.handler(any()) }
}
}
當我運行這個測驗時,我得到一個
java.lang.AssertionError: Verification failed: call 1 of 1: EventHandler(#4).handler(matcher<SomeEvent>())) was not called
錯誤,但是通過使用除錯器,我可以看到handler輸入了正確引數的函式。那么為什么不驗證捕獲handler函式的執行呢?
uj5u.com熱心網友回復:
所以使用springmockk:
搖籃:
testImplementation("com.ninja-squad:springmockk:3.1.1")
馬文:
<dependency> <groupId>com.ninja-squad</groupId> <artifactId>springmockk</artifactId> <version>3.1.1</version> <scope>test</scope> </dependency>
本次測驗:
@SpringBootTest
class SendWelcomeEmailTest {
@Autowired
lateinit var publisher: ApplicationEventPublisher
@MockkBean(relaxed = true)// strict by default!
private lateinit var listenerMock: EventHandler
@Test
fun test() {
val someObject = SomeObject()
val event = SomeEvent(this, someObject)
publisher.publishEvent(event)
verify { listenerMock.handler(any()) }
}
}
..應該通過!
還請考慮:
如果要確保不使用 Mockito(以及標準的 MockBean 和 SpyBean 注釋),還可以排除 mockito 依賴項:
testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(module = "mockito-core")}
...限制,兼容性。
uj5u.com熱心網友回復:
僅僅因為您呼叫mockkClass(EventHandler::class),注冊在 Spring 容器中的 bean 不會神奇地被您的本地 mock 替換。仍然呼叫原始 bean(正如您使用除錯器驗證的那樣),并且您的本地模擬不參與 Spring 容器。
一般來說,您可以使用@MockBeanSpring(查看 Javadocs 了解詳細資訊),它將創建一個 Mockito 模擬并將其注冊到 Spring 容器中,替換原始 bean(這是由 Spring 測驗框架在幕后完成的)。
但我認為在你的情況下這可能行不通,因為 bean 可能不會被注冊為事件處理程式,但你可以嘗試。
如果@MockBean不起作用,我看到的唯一選擇是顯式宣告一個手工制作的“模擬”EventHandler子類并用 標記它@Primary,以便 Spring 選擇它而不是原始子類。然后你可以在那里添加任何你喜歡的驗證方法(例如在模擬handler方法中,將到達的事件保存到本地狀態,并添加一個方法來讀取記錄的狀態)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505171.html
下一篇:朱莉婭的一組試驗的平均時間?
