### Question:
AbstractShell extends AbstractShellStatusPublisher implements Shell { @CliCommand(value = {"system properties"}, help = "Shows the shell's properties such as if " + "'addon development mode' is enabled, JVM version, file encoding...") public String props() { final Set<String> data = new TreeSet<String>(); for (final Entry<Object, Object> entry : System.getProperties().entrySet()) { data.add(entry.getKey() + " = " + entry.getValue()); } return StringUtils.join(data, LINE_SEPARATOR) + LINE_SEPARATOR; }  static String versionInfo(); static String buildInfo(); static String versionInfoWithoutGit(); @CliCommand(value = {"/*"}, help = "Start of block comment") void blockCommentBegin(); @CliCommand(value = {"*/"}, help = "End of block comment") void blockCommentFinish(); String date(); boolean executeCommand(final String line); void flash(final Level level, final String message, final String slot); ExitShellRequest getExitShellRequest(); File getHome(); String getShellPrompt(); @CliCommand(value = {"//", ";"}, help = "Inline comment markers (start of line only)") void inlineComment(); @CliCommand(value = {"system properties"}, help = "Shows the shell's properties such as if " + "'addon development mode' is enabled, JVM version, file encoding...") String props(); @CliCommand( value = {"script"}, help = "Parses the specified resource file and executes its Roo commands. You can as well execute " + "_*.roo_ example scripts in the Roo classpath. Ex.: `script --file clinic.roo`.") void script(
      @CliOption(key = {"", "file"}, help = "The file to locate and execute.", mandatory = true) final File script,
      @CliOption(key = "lineNumbers", mandatory = false, specifiedDefaultValue = "true",
          unspecifiedDefaultValue = "false",
          help = "Display line numbers when executing the script. "
              + "Default if option present: `true`; default if option not present: `false`.") final boolean lineNumbers,
      @CliOption(key = "ignoreLines", mandatory = false,
          help = "Comma-list of prefixes to ignore the lines that starts with any of the provided "
              + "case-sensitive prefixes.") final String ignoreLines); void setPromptPath(final String path); void setRooPrompt(final String prompt); void setPromptPath(final String path, final boolean overrideStyle); void setTailor(final Tailor tailor); @Override void addListerner(CommandListener listener); @Override void removeListener(CommandListener listener); @CliCommand(value = {"version"}, help = "Displays Roo Shell banner and version.") String version(
      @CliOption(key = "", help = "Special version flags, like `roorocks`.") final String extra); static String completionKeys; static String shellPrompt; }### Answer:
@Test public void testProps() { final AbstractShell shell = mock(AbstractShell.class); when(shell.props()).thenCallRealMethod(); final String props = shell.props(); assertNotNull(props); }