I would go with the @Vasiliy approach, but with a little change. Instead of using System.out.println for logging, we can actually use the Java Logger configured with the ConsoleHandler to log messages on the test output screen.
This can be achieved in the following simple steps.
Step 1: Define Your Own Log Level
public enum LogLevel { VERBOSE, DEBUG, INFO, WARNING, ERROR, SILENT }
Step 2: Define the Logger Abstraction
public abstract class Logger { .... public abstract void debug(String tag, String message); public abstract void error(String tag, String message); .... }
Step 3: implementation based on java.util.Logging 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: implementation based on android.util.Log 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 Implementation Through Logger
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
Using the onCreate Method
AppLogger.init(new AndroidLogger(LogLevel.DEBUG));
Junit
AppLogger can be initialized either in @BeforeClass or in @Before
AppLogger.init(new JavaLogger(LogLevel.DEBUG, "test-logger"));
Now you can watch the log message in the test window of Android Studio.