2016-04-13 36 views
1

Bir ayrıştırıcı için Junit testleri yazmaya çalışıyorum. Bu ayrıştırıcı, seçilen bir dosyadan köşe ve köşe grafiğini oluşturur. Ayrıştırıcıda ihtiyacım olan köşe noktalarını oluşturmak için birçok kez "VertexImpl" yapıcısını çağırıyorum.Açıklamalar için Guice And Mockto

Ayrıştırıcıyı test ettiğimde, gerçek "VertexImpl" nesnesini oluşturmak istemiyorum, çünkü bunun gerçek bir birim testi olmasını istiyorum.

Yapımcı "Mockito" ve "Guice" kullanılarak çağrıldığında her zaman sahte bir nesneyi nasıl yaparım?

+0

JUnit + Guice + mockito = https://github.com/ArcBees/Jukito –

cevap

1

Çözümleyicinizin belirli nesneler oluşturmasını istemiyorsanız; iyi; daha sonra bu tür nesneleri oluşturmamak için yeniden yazınız.

Demek istediğim: çözümleyici, ayrıştırıcının böyle VertexImpls oluşturmak için kullanabileceği bir "fabrika" nesnesine sahip olmalıdır. Ünite testiniz için o fabrikaya "alay ediyorsunuz"; Böylelikle ayrıştırıcının ne yapması gerektiği üzerinde tam kontrol sahibi olur.

Lütfen dikkat: test edilen kod, birim testi ve üretim kullanımı için aynıdır. Tek fark: ünite test kurulumunda, fabrika nesnesi farklıdır (nasıl yapılacağına bağlı olarak bağımlılık enjeksiyonu hakkında okumak istersiniz).

+0

Yani, geçici olarak sadece benim ayrıştırıcı değiştirmek gerekiyor ünite testi? –

+0

Hayır; Bunu daha açık hale getirmek için cevabı güncelledim. – GhostCat

+0

Mockito And Guice ile nasıl yapılacağına dair öğreticiler var mı? –

1

Sen test sınıfında böyle bir şey yapabilirsiniz:

@Inject 
private YourClassToMock _myMock; 

@Before 
public void setUp() throws Exception { 
    Guice.createInjector(/* Your application modules */, mockModule()) 
     .injectMembers(this); 
} 

private Module mockModule() { 
    return new AbstractModule() { 
     @Override 
     protected void configure() { 
      bind(YourClassToMock.class).toInstance(mock(YourClassToMock.class)); 
     } 
    }; 
} 

alan _myMock, YourClassToMock örneği, bu test için bir mock olarak enjekte edilecek ve diğerleri alanları üretimde gibi normalde enjekte edilecek (uygulama modüllerinin kullanımı nedeniyle).

dikkatli olun, size bir iğne tanımlayamazsınız iki kez