Alaycı çerçevelerde alay etmek ve casusluk yapmak


131

Alaycı çerçevelerde, bir nesneyle alay edebilir veya onu gözetleyebilirsiniz . İkisi arasındaki fark nedir ve birini diğerine ne zaman kullanmalı / kullanmalıyım?

Baktığımızda Mockito , örneğin, ben benzer şeyler kullanılarak yapılıyor bkz casusları ve mocks ama ikisi arasındaki ayrım olarak emin değilim.



Yanıtlar:


157

Sahte nesne, alay edilen sınıfı tamamen değiştirerek kaydedilen veya varsayılan değerleri döndürür. "İnce havadan" alay yaratabilirsiniz. Bu, çoğunlukla birim testi sırasında kullanılan şeydir.

Casusluk yaparken, mevcut bir nesneyi alırsınız ve yalnızca bazı yöntemleri "değiştirirsiniz". Bu, çok büyük bir sınıfınız olduğunda ve yalnızca belirli yöntemlerle (kısmi alay) dalga geçmek istediğinizde kullanışlıdır. Mockito belgelerinden alıntı yapmama izin verin :

Gerçek nesnelerin casuslarını yaratabilirsiniz. Casusu kullandığınızda, gerçek yöntemler çağrılır (bir yöntem saplanmadıkça).

Gerçek casuslar , örneğin eski kodla uğraşırken dikkatlice ve ara sıra kullanılmalıdır .

Şüphe duyduğunuzda alayları kullanın.


1
Teşekkür ederim! Bu onu çok daha net hale getirir. Mocks gerçek nesneye temsilci asla Yani alay olmak hiç ama casuslar yapmak.
Vivin Paliath

7
Taklitlerin "gerçek bir nesnesi" yoktur - taklit, başlangıçta oluşturulur.
Carl Manaster

4
Mockito'nun neden her zaman casus kullanmaya karşı uyardığına dair bir açıklama var mı? Alayları tercih ettiklerini söylediklerini görüyorum, ama nedeni konusunda net değilim.
Matt

9
Emin değilim, ama belki "Mockito" oldukları ve "Spyito" olmadıkları için: D
yazım hatası

16

Mockito, kısmi alay etmenin iyi bir uygulama olmadığı ve Nesne Yönelimli mimarinizi gözden geçirmeniz gerektiği konusunda uyarıyor. Eski kodu test etmek için casus (veya kısmi alay) önerilir .


16

Burada bir örnek kullanarak açıklamaya çalışacağım:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

Burada, listbir öğe eklediğimiz ve boyutun bir olmasını beklediğimiz ilk gerçek nesnemiz vardı .

Biz casus biz edilecek hangi yöntemin talimat verebilirsiniz gerçek nesne anlam stubbed . Biz yöntemi stubbed açıkladı Yani - size()on casus nesne 10 dönecektir, hiçbir gerçek boyut nedir önemli.

Özetle, gerçek nesneyi gözetleyecek ve bazı yöntemleri saplayacaksınız .


2

Referans: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

Sahte nesneleri kullanırken, yöntemin saplama olmadığında varsayılan davranışı hiçbir şey yapmamaktır. Basit anlamına gelir, eğer bu bir void yöntemi ise, o zaman yöntemi çağırdığınızda hiçbir şey yapmaz veya dönüşlü bir yöntemse, o zaman boş, boş veya varsayılan değeri döndürebilir.

Casus nesnelerde, tabii ki, gerçek bir yöntem olduğu için, yöntemi saplamadığınız zaman, gerçek yöntem davranışını çağıracaktır. Yöntemi değiştirmek ve alay etmek istiyorsanız, o zaman saplamanız gerekir.


2

Kukla nesneler etrafta dolaştırılır, ancak gerçekte asla kullanılmaz. Genellikle sadece parametre listelerini doldurmak için kullanılırlar.

Sahte nesnelerin aslında çalışan uygulamaları vardır, ancak genellikle onları üretim için uygun olmayan kılan bazı kısayollar kullanırlar (bellek içi veritabanı iyi bir örnektir).

Stub'lar , test sırasında yapılan aramalara hazır yanıtlar sağlar, genellikle test için programlananların dışındaki hiçbir şeye yanıt vermez.

Casuslar , nasıl çağrıldıklarına bağlı olarak bazı bilgileri kaydeden koçanlardır. Bunun bir biçimi, kaç mesajın gönderildiğini kaydeden bir e-posta hizmeti olabilir.

Burada bahsettiğimiz şey taklitler : beklentilerle önceden programlanmış nesneler, almaları beklenen çağrıların bir özelliğini oluşturur.

Mocks, Stubs Değildir Yazan Martin Fowler


1

Casusların iki tanımı vardır. Birincisi, gerçek yöntemin çağrıldığı, diğeri, işlevselliğin çağrılmadığı ve yalnızca boş veya boş eşdeğer değerlerin döndürüldüğü, ancak yöntemler çağrıldığı ve durumlarının kaydedildiği, genellikle x yönteminin y kez çağrıldığı gibi.


0

Mockito'da, Mock Object'in örnek değişkenine herhangi bir nesne atarsanız, Mock Object'i etkilemez.

Ancak Spy durumunda, Spy Object'in örnek değişkenine herhangi bir nesne atarsanız, Spy'ın gerçek zamanlı nesne değişikliği gibi davranması nedeniyle Casus Nesneyi etkiler.

Bir referans örneği için

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.