Протестируйте внутренний класс с помощью Pax Exam

В настоящее время у меня есть тестовый класс для тестирования внутреннего класса с использованием Pax-Exam 5.

@ProbeBuilder
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
   probe.setHeader("Fragment-Host", "com.mycompany.abc");
   return probe;
}

Причина, по которой я использую Fragment-Host, заключается в том, чтобы избежать экспорта внутреннего пакета для пакета com.mycompany.abc. Но я получаю эту ошибку

org.ops4j.pax.exam.TestContainerException: org.osgi.framework.BundleException: Invalid operation on a fragment.
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.install(NativeTestContainer.java:135)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.install(NativeTestContainer.java:140)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.installProbe(NativeTestContainer.java:428)
    at org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactor.setUp(EagerSingleStagedReactor.java:68)
    at org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactor.beforeClass(EagerSingleStagedReactor.java:106)
    at org.ops4j.pax.exam.spi.reactors.ReactorManager.beforeClass(ReactorManager.java:400)
    at org.ops4j.pax.exam.junit.DriverExtension.beforeClassBlock(DriverExtension.java:130)
    at org.ops4j.pax.exam.junit.ExtensibleRunner$1.evaluate(ExtensibleRunner.java:53)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.ops4j.pax.exam.junit.PaxExam.run(PaxExam.java:78)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: org.osgi.framework.BundleException: Invalid operation on a fragment.
    at org.eclipse.osgi.container.Module.checkFragment(Module.java:520)
    at org.eclipse.osgi.container.Module.start(Module.java:408)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:428)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:447)
    at org.ops4j.pax.exam.nat.internal.NativeTestContainer.install(NativeTestContainer.java:131)
... 15 more

Есть ли другое решение?

Спасибо


person Abraham    schedule 28.12.2018    source источник
comment
Фрагменты нельзя запускать, так как они не имеют независимого жизненного цикла. Ошибка просто говорит о том, что вы (или кто-то другой) вызвали метод start для фрагмента. Вам нужно найти способ настроить экзамен PAX так, чтобы он устанавливался, но не запускал ваш фрагмент.   -  person Neil Bartlett    schedule 01.01.2019
comment
Привет @NeilBartlett, спасибо за ответ. Я не могу найти способ настроить экзамен pax, чтобы не запускать пакет, содержащий сам тестовый класс. Может быть, вы можете помочь мне, дав ссылку, пожалуйста   -  person Abraham    schedule 02.01.2019
comment
Извините, я тоже не знаю, потому что я не использую экзамен PAX. Если бы я знал, я бы дал это как полноценный ответ на ваш вопрос, а не просто комментарий. Я надеялся, что мой комментарий поможет вам или кому-то еще найти реальный ответ.   -  person Neil Bartlett    schedule 02.01.2019


Ответы (1)


Pax Exam поддерживает подготовку фрагментов, потому что вы можете вызвать .noStart() в опции подготовки, чтобы сообщить Pax Exam, что пакет/фрагмент не должен запускаться:

CoreOptions.mavenBundle("gid", "aid", "version").noStart();

Но вы пытаетесь добиться другого, вы пытаетесь превратить свой тестовый пакет в фрагмент тестируемого пакета.

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

  1. Используйте TinyBundles для создания фрагмента, который экспортирует внутренние пакеты тестового пакета.
  2. Передайте фрагмент в Pax Exam как опцию url() с .noStart()

см. следующий класс для примера:

https://github.com/ops4j/org.ops4j.pax.exam2/blob/exam-reactor-3.2.0/itest/osgi/src/it/regression-multi/src/test/java/org/ops4j/pax/exam/regression/multi/fragment/FragmentTest.java#L61

Другими словами, вместо того, чтобы делать зонд фрагментом хоста, создайте на лету пустой фрагмент только для того, чтобы экспортировать пакеты хоста в интересах зонда.

Отказ от ответственности: я не пробовал это, это просто гипотеза.

person GianMaria Romanato    schedule 16.01.2019