#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.