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