Kısa cevap, örneğinizde sonucunun mock.method()
türe uygun bir boş değer olacağıdır; mockito MockingProgress
, bir taklit üzerinde bir yöntemin çağrılmasının, saplama hakkındaki bilgileri geri dönüş değeri aracılığıyla iletmek yerine, mevcut bir stublanmış davranışın kopyalanması veya yeniden oynatılması için olup olmadığını belirlemek için proxy oluşturma, yöntem durdurma ve sınıfın paylaşılan bir örneğini kullanarak dolaylı yoldan ulaşmayı kullanır . alay konusu bir yöntem.
Mockito koda bakarak birkaç dakika içinde yapılan mini analiz aşağıdaki gibidir. Unutmayın, bu çok kaba bir tanım - burada oyunda pek çok ayrıntı var. Github'daki kaynağı kendiniz kontrol etmenizi öneririm .
Birincisi, sınıfın mock
yöntemini kullanarak bir sınıfla dalga geçtiğinizde Mockito
, esasen şu olur:
Mockito.mock
org.mockito.internal.MockitoCore
.mock'a delegeler , varsayılan sahte ayarları bir parametre olarak iletir.
MockitoCore.mock
org.mockito.internal.util.MockUtil
.createMock delegeleri
MockUtil
Sınıf kullanan ClassPathLoader
bir örneğini almak için sınıf MockMaker
alay oluşturmak için kullanmak. Varsayılan olarak, CgLibMockMaker sınıfı kullanılır.
CgLibMockMaker
JMock'tan ödünç alınan, taklidi ClassImposterizer
oluşturmayı sağlayan bir sınıf kullanır . Kullanılan 'Mockito büyü' kilit nitelikteki MethodInterceptor
Mockito: mock oluşturmak için kullanılan MethodInterceptorFilter
ve bir örneği de dahil olmak üzere MockHandler örnekleri, bir zincir MockHandlerImpl . Yöntemi engelleyici, çağrıları MockHandlerImpl örneğine iletir; bu, bir yöntem bir sahte üzerinde çağrıldığında uygulanması gereken iş mantığını uygular (yani, bir yanıtın önceden kaydedilip kaydedilmediğini görmek için arama yapmak, çağrının yeni bir saplamayı temsil edip etmediğini belirlemek vb.) Varsayılan durum, çağrılan yöntem için bir saplama önceden kayıtlı değilse, türe uygun boş bir değerin döndürülmesidir.
Şimdi, örneğinizdeki koda bakalım:
when(mock.method()).thenReturn(someValue)
İşte bu kodun çalıştırılacağı sıra:
mock.method()
when(<result of step 1>)
<result of step 2>.thenReturn
Neler olup bittiğini anlamanın anahtarı, sahte yöntem çağrıldığında ne olduğudur: yöntem durdurucu, yöntem çağrısı hakkında bilgi aktarılır ve MockHandler
sonunda temsilci olarak atanan örnekler zincirine delege eder MockHandlerImpl#handle
. Sırasında MockHandlerImpl#handle
, sahte işleyici bir örnek oluşturur OngoingStubbingImpl
ve bunu paylaşılan MockingProgress
örneğe aktarır.
Tüm when
yöntem çağırma sonra çağrılır method()
için temsilcilerin bulunduğu, MockitoCore.when
aramaları, stub()
aynı sınıfın bir yöntem. Bu yöntem MockingProgress
, alay edilen method()
çağrının yazdığı paylaşılan örnekten devam eden saplamayı çözer ve onu döndürür. Daha sonra thenReturn
yöntem, OngoingStubbing
örnekte çağrılır .