2014-05-21 24 views
5

son sınıfına sahipse, InjectMocks nasıl kullanılır? Bazı hizmetleri mockito ile test etmek istiyorum. Servisler CDI'ya dayanıyor ve maalesef değişemediğim tarla enjeksiyonu kullanıyorlar.Enjekte edilecek örneğin

public class Service { 
    @Inject Logger logger; 

    public void method() { 
     logger.info("some log text"); 
    } 
} 

Şimdi Mockito en @InjectMocks ek açıklamasıyla test edilebilir örneklerini oluşturmak için oldukça kolaydır. Ya alay ve casuslar enjekte edecek.

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest { 
    @Spy Logger logger = LoggerFactory.getLogger(Service.class); 

    @InjectMocks Service service; 

    @Test public void test() { 
    // Given 
    // When 
    service.method(); 
    // Then 
    } 

Servis sınamamda test edilen bazı çalışma günlüğüne ihtiyacım var. Logger çerçevesi slf4j'dir, tercih edilen logger logback'dir. Ancak maalesef, logback'in Logger uygulaması son halini alıyor, bundan dolayı casusluk yapamıyorum, bir çalışma zamanı istisnasıyla sonuçlanıyor. Aklıma gelen

Geçici Çözümler:

  • kullanım yansıma (non-son) logger sarıcı hizmeti logger niteliğini (kötü adamın enjeksiyon)
  • bir spyable uygulamak başlatmak için buna delegeler son günlüğe kaydetme günlüğü günlüğü

Ancak bu sorun (lar) için temiz veya en azından daha iyi bir çözüm var mı?

+0

Test altyapınıza [Kaynak SE] (http://docs.jboss.org/weld/reference/latest/en-US/html_single/#d0e5727) eklemeyi düşündünüz mü? –

+0

@SteveC - yes. Ama gerçek CDI enjekte eden alaylarla gerçekten çok fena (Ben proje üzerinde guice özledim). Moralsiz entegrasyon testleri için arquillian kullanıyorum. Buna eklemek için –

cevap

2

Test edilen sınıfınız büyük olasılıkla Logback'i yanlış kullanmaktadır. logger alanını ch.qos.logback.classic.Logger türünde bildirmek yerine, son Logback logger sınıfı tarafından uygulanan arabirim türü org.slf4j.Logger olmalıdır. Bu şekilde, alay edilmek veya enjekte edilmek üzere final sınıfı olmadığından sorunu önlemekten kaçınırsınız.

+0

... Bir arayüz uygulayan bir sınıf alay ederken. Buradaki cevaptan dolayı, ara yüzle dalga geçmek her zaman en iyisidir. Ayrıca, eğer sınıfınızı alay ediyorsanız, yine de uygulamayı umursamıyorsunuz. – ndrone

+0

Evet .. ama .. dediğim gibi, bu sefer arayüzle dalga geçmek istemiyorum çünkü logger ifadelerini konsoldaki test altındaki sınıftan okumak istiyorum. Elbette, bu özel bir durum ve tam otomatik testlerde gerçekten umrumda değil, ama bunu geliştirme aşamasında istiyorum. –

+0

Ah, btw., Bildirilen tür "org.slf4j.Logger" dir. Fabrika, logback uygulamasını döndürür. Ve bu ders finaldir, bu yüzden Spy mutsuzdur. –