Log messages in android studio junit test

前端 未结 4 1729
余生分开走
余生分开走 2020-12-30 03:25

Is there a way to print out Logcat (Log.i, Log.d) messages when running a JUnit (method) test in Android Studio?

I can see System.out.print message but no logcat pri

4条回答
  •  一向
    一向 (楼主)
    2020-12-30 03:48

    I would go with @Vasiliy's approach but with a small change. Instead of using System.out.println for logging, we can actually use Java Logger configured with ConsoleHandler to log messages on the test output screen.

    This can be achieved in below listed simple steps

    Step 1: Define your own Log Level

      public enum LogLevel {
        VERBOSE,
        DEBUG,
        INFO,
        WARNING,
        ERROR,
        SILENT
    }
    

    Step 2: Define Logger abstraction

    public abstract class Logger {
    
        ....
    
        public abstract void debug(String tag, String message);
    
        public abstract void error(String tag, String message);
       ....
    
    }
    

    Step 3: java.util.Logging based implementation for Logger

    public class JavaLogger extends Logger {
    
        private java.util.logging.Logger mLogger;
    
        public JavaLogger(LogLevel logLevel, String name) {
            mLogger = java.util.logging.Logger.getLogger(name);
            ConsoleHandler handler = new ConsoleHandler();
            Level level = mapLogLevel(logLevel);
            handler.setLevel(level);
            mLogger.addHandler(handler);
            mLogger.setLevel(level);
        }
    
        @Override
        public void debug(String tag, String message) {
            if (isLoggable(LogLevel.DEBUG)) {
                mLogger.finer(message);
            }
        }
    
        @Override
        public void error(String tag, String message) {
            if (isLoggable(LogLevel.ERROR)) {
                mLogger.severe(message);
            }
        }
    
        ....
    
        private Level mapLogLevel(LogLevel logLevel) {
            Level level = Level.OFF;
            switch (logLevel) {
                case INFO:
                    level = Level.INFO;
                    break;
    
                case WARNING:
                    level = Level.WARNING;
                    break;
    
                case ERROR:
                    level = Level.SEVERE;
                    break;
    
                case VERBOSE:
                    level = Level.FINEST;
                    break;
    
                case DEBUG:
                    level = Level.FINER;
                    break;
    
                case SILENT:
                    level = Level.OFF;
                    break;
    
                default:
                    // no impl
            }
    
            return level;
        }
    }
    

    Step 4: android.util.Log based implementation for Logger

    public class AndroidLogger extends Logger {
    
    public AndroidLogger(LogLevel logLevel) {
        super(logLevel);
    }
    
     ....
    
    @Override
    public void debug(String tag, String message) {
        if (isLoggable(LogLevel.DEBUG)) {
            Log.d(tag, message, null);
        }
    }
    
    @Override
    public void error(String tag, String message) {
        if (isLoggable(LogLevel.ERROR)) {
            Log.e(tag, message, tr);
        }
    }
    
    ....
    

    }

    Step 5: Create a simple wrapper class for over Logger implementation

       public class AppLogger { 
    
        private static Logger sLogger;
    
       public static void init(Logger logger) {
            sLogger = logger;
        }
    
       public static void debug(final String tag, String message) {
            sLogger.debug(tag, message);
        }
    
        public static void error(final String tag, String message) {
            sLogger.error(tag, message, null);
        }
    
        public static void error(final String tag, String message, Throwable t) {
            sLogger.error(tag, message, t);
        }
    
        ... 
    }
    

    Step 6: Initialization

    Android

    Application onCreate method

    AppLogger.init(new AndroidLogger(LogLevel.DEBUG));
    

    Junit

    AppLogger can be initialized in either @BeforeClass or @Before

    AppLogger.init(new JavaLogger(LogLevel.DEBUG, "test-logger"));
    

    Now you can observe the log message in Test Run Window of Android Studio

提交回复
热议问题