2011-12-15 24 views
5

'ImporterService' sınıfımı test etmek için bir test sınıfı yazıyorum. Bu hizmet bir InputStream okuyor ve veriden bir Nesne oluşturuyor. Nesne, bu durumda bir Builder sınıfı, 'ImporterService' sınıfı içinde başlatılır. 'ImporterService' sınıfımı test etmek için Builder sınıfındaki davetleri doğrulamam gerekiyor. Bunun için Alaycı bir çerçeve kullanmak istiyorum, ancak 'ImporterService' dışında 'Builder' nesnesinin sahte bir örneğini oluşturmak nasıl mümkün olabilir? Ben testin kurulumuna geçersiz kılabilir korumalı yöntem haline Oluşturucu sınıfı oluşturulmasını taşınmayı düşünüyordumDahili anlık nesneyi taşıma

 


    public Builder importFrom(BufferedReader reader) throws IOException { 
     String someValue = readFrom(reader); 
     Builder builder = new Builder(); // I need to mock this Builder object... 
     builder.someMethod(someValue);  // to see of a method is called with the expected value 
    } 
 

: gibi

benim 'ImporterService' sınıfının yöntem görünüyor. Ancak 'Çözümleyici Hizmet' sınıfı bazı içsel mantığı sızdırıyor ve benim istemediğim diğer sınıflar tarafından yöntemi geçersiz kılmayı mümkün kılıyor.

cevap

2

Herhangi bir bağımlılık enjeksiyon kitaplığı (İlkbahar gibi) kullanıyorsanız, oluşturucu yerine sahte nesneyi ImporterService sınıfına enjekte edebilirsiniz. Ya da fabrika çağrısı yapılarak yapıcıya yapılan çağrıyı değiştirebilir ve fabrikada kod kullanarak test kodunda geri dönebilirsiniz.

+0

: Aşağıdaki do senin birim testlerinde

public class Reader{ private BuilderFactory factory = new BuilderFactory(); // Use production factory by default public Builder importFrom(BufferedReader reader) throws IOException { String someValue = readFrom(reader); Builder builder = factory.buildBuilder(); builder.someMethod(someValue); // to see of a method is called with the expected value } } 

: Burada

bunu başarmak nasıl gösteren EasyMock kullanarak bir örnektir ünitenizde yay veya başka bir DI çerçevesinde test edin. Kabloyu test etmediğin sürece –

0

(bunu alaycı bir çerçeve recomment) jMockt kullandığınız varsayarak, aşağıdakileri yapmanız mümkün olacak: Böyle PowerMock olarak

@Test 
    public void testFoo(@Mocked Builder builder) { 
     new Expectations() { 
      { 
       new Builder(); 
       returns(builder); 

       builder.setSomemethod() 
       ... 
      } 
     }; 

     assertSame(builder,impoertesService.importFrom(...)); 
    } 
0

Bazı alaycı çerçeveler nesnelerin inşaat alay edebilir.

0

böyle bir şey için işlev imzayı değiştirebilirsiniz:

public Builder importFrom(BufferedReader reader, Builder builder) throws IOException { 

bunu yaparak test davadan herhangi kukla uygulanmasını geçebilir. Bu bir bağımlılık enjeksiyonu yoludur.

Bağımlılık enjeksiyonu fikri tüm bağımlılıklarınızı sormaktır ve eğer bir sınıf/fonksiyon bunu yaparsa, kod oldukça test edilebilir hale gelir.

1

Evet, size Önerilen yapmak ya ya:

Eğer Builder nesneleri oluşturmak ve okuyucu sınıfına atamak olduğu bir fabrika sınıf oluşturun. Ünite testlerinizde bu fabrikayı alay edin ve birim testinizde yöntem çağrılarını kontrol edebileceğiniz bir Builder oluşturmak için zorlayın. İhtiyacınız olmayan iyi alaycı framework kullanıyorsanız

Reader classUnderTest = new Reader(); 
BuilderFactory fakeFactory = EasyMock.createNiceMock(BuilderFactory.class); 
Builder builder = EasyMock.createMock(Builder.class); 
EasyMock.expect(fakeFactory.buildBuilder()).andReturn(builder); 
builder.someMethod("value here"); 
EasyMock.expectLastCall().once(); 
EasyMock.replay(fakeFactory, builder); 
classUnderTest.importFrom(bufferReader); 
// Very that all calls were correctly performed on the builder 
EasyMock.verify(builder);