Протестируйте Java-приложение iText с помощью Groovy

#java #groovy #itext #junit4 #bouncycastle

#java #groovy #itext #junit4 #bouncycastle

Вопрос:

Я разработал приложение JAVA (JDK1.6) для управления PDF-файлом с помощью iText (версия 5.5.0). После того, как я написал тестовое приложение с использованием groovy, но когда я создаю объект PdfReader, в моем тестовом примере,

 PdfReader pdfReader = new PdfReader("/my/path/project/test.pdf")
  

Я получаю следующую ошибку:

 java.lang.NoClassDefFoundError: org/bouncycastle/cms/RecipientId
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2484)
...
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.cms.RecipientId
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  

Первые утверждения в тестовом классе groovy работают нормально.
Я создал тот же тестовый класс с JUnit4, и все работает нормально!

Как я могу исправить ошибку в тестовом классе groovy?

Я не использую класс bouncycastle, почему у меня есть это исключение ClassNotFound?

Редактировать:

GroovyTestCase

 class PdfMergeItextTest extends GroovyTestCase {
    PdfMergeItext pdfMerge

    void setUp() {
        super.setUp();
        println "Test class [PdfMergeItext] avviato..."

        pdfMerge = new PdfMergeItext()
        pdfMerge.openOutputPdf("/my/path/project/output.pdf")
    }

    void tearDown() {
        println "Test class [PdfMergeItext] END."
    }

    @Test
    void testMergeSinglePdfFile() {
        println "Test one Pdf.."

        File outputPdf = new File("/my/path/project/output.pdf")
        assertTrue outputPdf.exists()
        PdfReader pdfReader = new PdfReader("/my/path/project/test.pdf")
        pdfMerge.addPdf(pdfReader)
        pdfMerge.flush()
        pdfMerge.close()

        assert outputPdf.size() > 0

        println "File size: ${outputPdf.size()}"

        println "End test one Pdf"
    }
}
  

Тестовый кейс JUnit4

 public class PdfMergeItextUnitTest {
    PdfMergeItext pdfMergeItext = null;

    @Before
    public void setUp() throws Exception {
        System.out.println("Start..");

        this.pdfMergeItext = new PdfMergeItext();
        this.pdfMergeItext.openOutputPdf("/my/path/project/output.pdf");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("END!");
    }

    @Test
    public void testMergePdfFile() throws IOException, BadPdfFormatException {
        File outputPdf = new File("/my/path/project/output.pdf");

        Assert.assertTrue(outputPdf.exists());

        PdfReader pdfReader = new PdfReader("/my/path/project/test.pdf");

        this.pdfMergeItext.addPdf(pdfReader);
        this.pdfMergeItext.flush();

        this.pdfMergeItext.close();

        Assert.assertTrue(outputPdf.size() > 0);
    }
}
  

Спасибо

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

1. речь идет не о создании теста. вы неправильно указали путь к тестовому классу

2. @injecteer Почему ты это сказал? Мои первые утверждения в тестовом классе groovy работают нормально, и тот же тестовый класс с JUnit4 работает нормально!

3. Я могу только строить догадки, поскольку я не вижу здесь никакого кода 🙂

4. PdfReader имеет зависимость от BouncyCastle. Для расшифровки файлов PDF требуется BC.

5. Maven действительно автоматически разрешает зависимости, вот почему люди используют Maven. Вы можете найти необходимые jar и версии в POM: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.49</version> <type>jar</type> <scope>compile</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.49</version> <type>jar</type> <scope>compile</scope> <optional>true</optional> </dependency>

Ответ №1:

Банки BounceCastle являются необязательными, см. pom.xml (поиск зависимости). Итак, если вы не включили их в свой pom.xml build.gradle редактор, вы их не получите (в любом случае, какой инструмент сборки вы используете)?

Поэтому, если вы используете управление зависимостями, я понимаю, почему его там нет. Реальный вопрос: почему это нужно в первом тесте, а не во втором тесте?

  • Пожалуйста, сделайте тесты полностью одинаковыми (вы вызываете addPdf один раз против двух, и вы вызываете length против size
  • Поскольку BounceCastle используется для дешифрования, вы тестируете с тем же файлом PDF?

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

1. Теперь мои тесты эквивалентны, но это не важно, потому что исключение было сгенерировано раньше, когда я создавал объект PdfReader. Я тестирую тот же PDF-файл, и файл PDF не зашифрован. Я использую Maven в проекте IntelliJ IDEA, я не использую никаких внешних инструментов для сборки.

2. Я взял ваш код и протестировал его. Оба теста (JUnit и Groovy) завершаются с одинаковой ошибкой: отсутствует BouncyCastle. Я также заметил, что вы используете GroovyTestCase, который предназначен для JUnit3, и Annotation @Test, который предназначен для JUnit4, поэтому вы смешиваете обе версии. Если вы хотите, я могу опубликовать свой код. Поскольку у меня нет вашего тестируемого класса, это может быть причиной сбоя.

3. Я переписал свой тестовый пример groovy, и теперь он работает нормально. Я не знаю, почему предыдущий класс не работает. В моем проекте Maven разрешает все зависимости, а также библиотеку BouncyCastle.