Хотя я понимаю, что это может быть не самый типичный вариант использования, мне нужно было включить Spring Boot в приложение Java Swing.Частично я смог сделать это, сославшись на эту статью .
Однако теперь у меня возникла проблема с тестированием.В частности, если я пытаюсь запустить тест JUnit, такой как:
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("dev")
@Transactional
public class MapperTest {
@Test
public void testMapping() {
Report rep = appMapper.mapReportDTO(dto);
assertThat(rep.getDateSubmitted()).isEqualTo(dto.getDateSubmitted());
assertThat(rep.getCoverageYear()).isEqualTo(dto.getCoverageYear());
assertThat(rep.getSpouse().getSpouseSSN()).isEqualTo(dto.getSpouse().getSpouseSSN());
assertThat(rep.getAgreements().size()).isEqualTo(dto.getAgreements().size());
for (ReportAgreement agree : rep.getAgreements()) {
assertThat(agree.getSignature()).isNotEmpty();
assertThat(agree.getSignatureDate()).isNotEmpty();
}
assertThat(rep.getBeneficiaries().size()).isEqualTo(dto.getBeneficiaries().size());
for (BenReport ben : rep.getBeneficiaries()) {
assertThat(ben.getBenFirst()).isNotEmpty();
assertThat(ben.getBenLast()).isNotEmpty();
assertThat(ben.getBenSSN()).isNotEmpty();
assertThat(ben.getBenType()).isNotEmpty();
}
assertThat(rep.getDependents().size()).isEqualTo(dto.getDependents().size());
for (DependentReport dep : rep.getDependents()) {
assertThat(dep.getDepDOB()).isNotNull();
assertThat(dep.getDepLast()).isNotEmpty();
assertThat(dep.getDepFirst()).isNotEmpty();
assertThat(dep.getDepSSN()).isNotEmpty();
}
assertThat(rep.getVisDependents().size()).isEqualTo(dto.getVisionDeps().size());
for (VisionDepReport vis : rep.getVisDependents()) {
assertThat(vis.getVisDOB()).isNotNull();
assertThat(vis.getVisFirst()).isNotEmpty();
assertThat(vis.getVisLast()).isNotEmpty();
}
}
// code omitted for brevity
}
, я получаю java.awt.HeadlessException
.На самом деле мне не нужно тестировать какой-либо из компонентов GUI, только функцию некоторых @Beans.Однако я понимаю, что проблема возникает из-за того, что мой класс @SpringBootApplication
вызывает элементы GUI.
@SpringBootApplication
public class EntryFrame extends JFrame {
private JPanel contentPane;
private JButton uploadBtn;
private final static String APP_DIR = "C:/Users/Kelly Marchewa/workspace/TestEnv/InsuranceApplications";
@Autowired
private DataAccessService service;
@Autowired
private IReportService reportService;
@Autowired
private IHTMLConverter htmlConverter;
public JEditorPane editorPane;
private JTable dataTable;
public EntryFrame() {
}
public static void main(String[] args) {
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(EntryFrame.class).headless(false).run(args);
EventQueue.invokeLater(() -> {
EntryFrame ex = ctx.getBean(EntryFrame.class);
ex.setVisible(true);
ex.initUI();
});
}
@Transactional
void initUI() {
// code omitted for brevity
}
}
Большинство @Beans, которые мне нужно протестировать, находятся в отдельном классе @Configuration:
@Configuration
public class AppConfig {
@Bean
public EntityManager entityManager() {
EntityManagerFactory sessionFactory = Persistence.createEntityManagerFactory("com.midamcorp.insuranceui");
return sessionFactory.createEntityManager();
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
@Bean
public IFileParser fileParser() {
return new FileParser(objectMapper());
}
@Bean
public IReportService reportService() {
return new ReportService();
}
@Bean
public EntryFrame entryFrame() {
return new EntryFrame();
}
@Bean
public ModelMapper mapper() {
ModelMapper mapper = new ModelMapper();
return mapper;
}
@Bean
public MutableDataHolder mutableDataHolder() {
MutableDataHolder opts = new MutableDataSet();
opts.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create()));
return opts;
}
@Bean
public Parser parser() {
return Parser.builder(mutableDataHolder()).build();
}
@Bean
public HtmlRenderer renderer() {
return HtmlRenderer.builder(mutableDataHolder()).build();
}
}
Есть ли эффективный способ избежать этой ошибки и успешно протестировать мой SpringКомпоненты приложения, учитывая необходимость графического интерфейса?