2013-10-17 24 views
6

kullanarak java servisinde statik kaydedicilere alay etme stratejisi nedir? Kaydedicilerin Powermock veya logger kullanan bir tür geçersiz kılınmış kurucu yardımıyla alay edildiğini görüyorum.mockito

Kodun her yerinde kullanılan kaydedici olmak, sadece mockito'yu kullanarak basit bir yol değil midir? Bazı yolu çağrıyı görmezden ya da alay - Hiç mesaj doğrulamak istemiyorum, sadece ben değil merak yerine karıştırma ve iki eşleştirme JMockit kullanmak am böylece çerçeveler alay yeni am boş gösterici hariç

kaçınmak istiyorum kütüphaneler-jomockit'i şu ana kadar önlemek için tek neden, sadece çok fazla güç dolu ve kolayca kötüye kullanılabilir!

+1

Neden kaydedicilerini alay etmek gerekiyor: Bu benim Mockito kullanarak bunu nasıl? Neden sadece oturumun gerçekleşmesine izin vermiyorsunuz? Bir dosyanın yazılmasını engelleyen bir sınama yapılandırması kurabilirsiniz (örneğin, yalnızca tüm oturumu konsola gönder). –

+0

Hmm, Basit ve daha iyi Fikir. – cpandey05

cevap

4

Belli bir düzeyde oturum açmanın çok önemli olduğunu düşündüğüm durumlarda günlüklerin doğrulanmasını kullanırım.

Utility Class

public final class LoggingTestUtil { 

    private LoggingTestUtil() { 
    } 

    public static void setupLoggingMock(Logger logger, Appender<ILoggingEvent> appender) { 
     logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
     when(appender.getName()).thenReturn("MOCK"); 
     logger.addAppender(appender); 
    } 

    public static void verifyLogAppended(Appender<ILoggingEvent> appender, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getMessage().contains(loggedString); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getLevel().equals(level); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       LoggingEvent event = (LoggingEvent) argument; 
       return event.getLevel().equals(level) && event.getMessage().contains(loggedString); 
      } 
     })); 
    } 
} 

Testi Sınıf

private static Logger root; 
@Mock 
private static Appender<ILoggingEvent> mockAppender; // used to test that logging occurs 

    @Test 
    public final void testSomething(){ 
     LoggingTestUtil.setupLoggingMocks(root, mockAppender); 
     underTest.doSomethingBad(); 
     LoggingTestUtil.verifyLogAppendedAtLevel(mockAppender, Level.ERROR, "bad thing"); 
    } 
+3

Alaylamanın, kırılgan ve aşırı olduğundan, günlük doğrulaması için zayıf bir strateji olduğuna inanıyorum. Log4j'de varsayılan kaydediciye geçici bir ekleyici ekleyen bir JUnit Kuralı oluşturdum. Bu daha sonra basitçe testin Kuralını ekleyerek günlüğün doğrulanmasını sağlar. https://github.com/dancerjohn/LibEx/blob/master/testlibex/src/main/java/org/libex/test/logging/log4j/Log4jCapturer.java –

+0

@JohnB - İlginç ... Bunu kontrol edecek. Düzey/dize değiştiğinde bu çözümü kırılgan buluyorum. Ancak bu konuda bir kural tam olarak aynı olmaz mı? Aşırı derken, bu alayların çok daha ağır olacağını mı söylüyorsun? Bilmeye oldukça meraklıyım, bilmeyi çok istiyorum. :) – Dennis

+0

1. Evet, atasözleri çok daha ağırdır ve beklenen yöntem çağrıları yapılandırılmalıdır. 2. Kayıt seviyesi, doğrulama işleminin bir parçasıysa SADECE başarısız olur. Bir ERROR mesajını bekliyorsanız ve başarısız olursa bir INFO idi. Herhangi bir seviyede bir mesaj beklerseniz başarısız olmaz. –