Почему не охвачен основной метод?

#java #code-coverage

#java #покрытие кода

Вопрос:

основной метод:

  public static void main(String[] args) throws Exception
{
    if (args.length != EXPECTED_NUMBER_OF_ARGUMENTS)
    {
        System.err.println("Usage - java XFRCompiler ConfigXML PackageXML XFR");
    }

    String configXML = args[0];
    String packageXML = args[1];
    String xfr = args[2];

    AutoConfigCompiler compiler = new AutoConfigCompiler();
    compiler.setConfigDocument(loadDocument(configXML));
    compiler.setPackageInfoDoc(loadDocument(packageXML));
    // compiler.setVisiblityDoc(loadDocument("VisibilityFilter.xml"));
    compiler.compileModel(xfr);     

}

private static Document loadDocument(String fileName) throws Exception
{
    TXDOMParser parser = (TXDOMParser) ParserFactory.makeParser(TXDOMParser.class.getName());
    InputSource source = new InputSource(new FileInputStream(fileName));
    parser.parse(source);
    return parser.getDocument();  

}
  

testcase:

 @Test
public void testCompileModel() throws Exception
{
  // construct parameters
  URL configFile =   Thread.currentThread().getContextClassLoader().getResource("Ford_2008_Mustang_Config.xml");
  URL packageFile = Thread.currentThread().getContextClassLoader().getResource("Ford_2008_Mustang_Package.xml");
  File tmpFile = new File("Ford_2008_Mustang_tmp.xfr");
  if(!tmpFile.exists()) {
     tmpFile.createNewFile();
  }

  String[] args = new     String[]{configFile.getPath(),packageFile.getPath(),tmpFile.getPath()};

  try {
    // test main method
    XFRCompiler.main(args);
  } catch (Exception e) {
    assertTrue(true);
  }
  try {
    // test args length is less than 3
    XFRCompiler.main(new String[]{"",""});
  } catch (Exception e) {  
    //ignore
  }
  tmpFile.delete(); 
}
  

Выходные данные покрытия отображаются в виде строк из String configXML = args[0]; в основном методе
не охвачены.

Комментарии:

1. Вы пишете тесты способом, который в некотором роде … отличается. Как правило, модульные тесты имеют возможность завершиться неудачей. Ваш всегда будет проходить.

2. Значение EXPECTED_NUMBER_OF_ARGUMENTS равно 3? Кроме того, в этой первой попытке / catch у меня было бы assert . Сбой, поскольку вы не ожидаете, что эта часть теста выдаст исключение.

3. да, 3. не имеет значения, вызывает он исключение или нет, дело в том, что покрытие, отображаемое как основной метод, не охвачено.

4. @Mike — Суть в том, что если бы он выдавал исключение (и, следовательно, фактически не запускал строки, которые вы ожидали), вы бы этого не поймали, поскольку блок catch просто утверждает true и продолжает работу.

5. странно, «String configXML = args[0];» не вызовет исключения, верно? но в покрытии указано, что эта строка не покрыта.

Ответ №1:

  • assertTrue(true); это бессмысленный отказ от операции
  • Удалите try / catch вокруг вызова XFRCompiler.main(args); , поскольку все, что он делает, это проглатывает исключения и усложняет отладку; скорее всего, вы увидите исключение, которое сообщит вам, в чем проблема.
  • После вызова fail() должен быть вызов XFRCompiler.main(new String[]{"",""}); , поскольку вы ожидаете, что он вызовет исключение
  • Поместите два вызова в отдельные методы тестирования.

Ответ №2:

Я беспокоюсь обо всем этом assertTrue(true) . Если исключения быть не может, то утверждение не требуется. Если возникнет неожиданное исключение, то этот код проглотит его, и вы получите поведение, которое видите прямо сейчас.

Тогда, если вы ожидаете исключения, вы должны написать код следующим образом:

 try {
    ... code that will throw an exception ...
    fail("No exception was thrown");
} catch (SpecficTypeOfException e) {
    assertEquals("message", e.getMessage());
}
  

Таким образом, будут проверены неправильные типы исключений и сообщение об исключении.

PS: Не отправляйте вопросы с пометкой «срочно». Мы уже помогаем так быстро, как только можем.

Комментарии:

1. Спасибо за ваш ответ. Даже он может пройти, но отчеты о покрытии по-прежнему отображаются, поскольку основной метод не был охвачен.

2. Запустите код в отладчике, чтобы на 100% убедиться, что он действительно выполняет эти строки. Возможно, мы чего-то не хватает.