2016-04-13 3 views
0

У меня есть Java-код, который использует JAR:Как проверить Java-код, который использует JAR?

public class Version { 
    public String getVersion() { 
     // Use Java Package API to return information specified in the manifest of this JAR. 
     return getClass().getPackage().getImplementationVersion(); 
    } 
} 

Как запустить тест JUnit для этого кода?

Он не работает в сборке разработки (в Eclipse), поскольку файл JAR пока отсутствует.

Он не работает в сборке (в Gradle), так как файла JAR пока нет.

+1

Вы бы издевались над ним. –

+2

Что вы испытываете? Если вы тестируете клиентов этого метода, подключите соответствующие макеты содержащего класса или интерфейса, который он реализует. Если вы тестируете реализацию метода, вы можете убедиться в том, что оно равно null или соответствует ожидаемому шаблону. Если вы тестируете 'getImplementationVersion()' себя, то остановитесь - это сторонний код, предположительно, с его собственными тестами. –

ответ

1

Вам всегда нужно высмеивать зависимости для тестирования вашего устройства. Граница - это единичный тест вашего кода, а не сама банка. Рамка Mockito хороша, и есть другие рамки, которые выполняют эту работу.

1

Скорее всего, это не может быть должным образом издеваемо (и, следовательно, не проверено модулем). Дело в том, что вы на самом деле вызываете метод «this». Но вы не можете проверить какой-то объект ... и одновременно издеваться над ним.

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

public String getVersion() { 
    return someObject.getClass()..... 
} 

, то вы можете создать фиктивный объект; и вставьте это в свой класс версии. Но даже тогда метод getClass() равен final внутри java.lang.Object; и поэтому вы не можете насмехаться над этим.

[Разумные насмешливые рамки, такие как EasyMock или Mokito, расширяя классы и переопределяя методы, которые вы хотите контролировать. Существуют такие структуры, как PowerMock, которые выполняют манипулирование байтовым кодом и которые позволяют это издеваться, но вы никогда не должны использовать такие библиотеки; так как они имеют очень плохие побочные эффекты (например, нарушение большинство библиотек покрытия)]

Что может работать:

class Version { 
    private final Package packageForVersionCheck; 

    public Version() { 
     this(getClass().getPackage())); 
    } 
    Version(Package somePackage) { 
     this.packageForVersionCheck = ... 
    } 

    public String getVersion() { 
     return this.packageForVersionCheck.getImpl.... 

Теперь вы можете использовать инъекции зависимостей, чтобы обеспечить «высмеивали» пакет, который возвращает эту строку. Но хорошо, похоже, что много кода почти не выигрывает.

Короткий рассказ: иногда вы просто не можете написать разумный модульный тест. Затем сделайте следующее самое лучшее: создайте «функциональный» тест, который автоматически будет выполнен в настройке «как клиент»; и убедитесь, что у вас есть автоматическая настройка для запуска таких тестов.

Смежные вопросы