У меня есть тестовый пример apache camel, который терпит неудачу из-за создания разных экземпляров объекта. Экземпляры объекта имеют разные идентификаторы

#unit-testing #junit #mockito #apache-camel #springjunit4classrunner

#модульное тестирование #junit #mockito #apache-camel #springjunit4classrunner

Вопрос:

Ниже приведена ошибка, которую я получаю —

 java.lang.AssertionError: mock://send Body of message: 0. Expected: <notification.scheduler.model.email.EmailNotificationRequest@943700a4> but was: <notification.scheduler.model.email.EmailNotificationRequest@c730128e>
Expected :<notification.scheduler.model.email.EmailNotificationRequest@943700a4> 
Actual   :<notification.scheduler.model.email.EmailNotificationRequest@c730128e>
  

Конфигурация моего класса выглядит следующим образом —

 @RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CustomerNotificationSchedulerApplication.class)
public class PrepareEmailReminderBodyRouteTest {


    @Autowired
    private CamelContext camelContext;

    @Produce(uri = "direct:prepareEmailReminder")
    private ProducerTemplate producer;

    @EndpointInject(uri = "mock:send")
    private MockEndpoint mockSendEndpoint;

    @Autowired
    private EmailNotificationRequestConfiguration emailNotificationRequestConfiguration;

    @Before
    public void before() throws Exception {
        camelContext.getRouteDefinition("prepareEmailReminderRoute").adviceWith(camelContext, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                interceptSendToEndpoint("direct:sendEmail")
                        .skipSendToOriginalEndpoint()
                        .to(mockSendEndpoint);
            }
        });
    }
  

И это неудачный тестовый пример, который терпит неудачу в mockSendEndpoint.expectedBodiesReceived(request);

 @Test
@DirtiesContext
public void whenOneRevisionPropertyListIsRetrievedThenSendOneEmailWithEmailTemplate() throws Exception {
    Journal journal = new Journal();
    journal.setEmail("supportX@gmail.com");

    Author author = new Author();
    author.setEmail("mail@mail.to");

    SubmissionDAO sub = new SubmissionDAO();
    sub.setSubmissionId("111111111");
    sub.setRevision(1);
    sub.setJournal(journal);
    sub.setAuthors(Collections.singletonList(author));

    String email = sub.getJournal().getEmail();
    String[] fetchEmail = email.split(",");
    String fromEmail = fetchEmail[0];
    String bccEmail = emailNotificationRequestConfiguration.getBcc().get("default");
    List<String> bccEmails = StringUtils.isNotBlank(bccEmail) ? Arrays.asList(bccEmail.split(",")) : Collections.emptyList();
    
    EmailNotificationRequest request = new EmailNotificationRequest();
    request.setTo(Collections.singletonList("mail@mail.to"));
    request.setSubject("Incomplete submission to Biology, ID: 111111111");
    request.setFrom(fromEmail);
    request.setBcc(bccEmails);
    request.setBody(escapeHtml4(IOUtils.toString(getSystemResourceAsStream("revision-reminder.html"), UTF_8)));

    mockSendEndpoint.setExpectedMessageCount(1);
    mockSendEndpoint.expectedBodiesReceived(request);

    producer.send(ExchangeBuilder.anExchange(camelContext)
            .withProperty(ExchangeProperties.FILTERED_SUBMISSIONS_LIST_PROPERTY, Collections.singletonList(sub))
            .build());

    mockSendEndpoint.assertIsSatisfied();
}
  

Как мне утвердить эти экземпляры объекта? Есть ли какой-нибудь способ? Или я делаю здесь что-то не так?

Также, к вашему сведению, я устанавливаю тело exchange в процессоре с новым EmailNotificationRequest .

Ответ №1:

AssertionError Жалуется, что два экземпляра объекта не равны, что очевидно, потому что они не являются одним и тем же экземпляром.

Один из них создается в вашем приложении, другой — в вашем тестовом примере.

Если вы хотите иметь возможность напрямую сравнивать их, вам необходимо реализовать методы equals и hashcode этого типа EmailNotificationRequest .

Другой способ — сравнить значения отдельных атрибутов объекта вместо всего экземпляра (например subject ).

Для этого вы можете получить полученные обмены из макета верблюда следующим образом

 List<Exchange> messages = mockSendEndpoint.getReceivedExchanges()
  

Затем вы можете выбрать одно сообщение из списка или перебрать все сообщения, чтобы сравнить тему, кому, откуда и т.д. с ожидаемыми значениями.

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

1. Спасибо за ответ, бурки. Но я уже реализовал метод equals amp; hashcode в EmailNotificationRequest классе. Проблема заключалась в чем-то другом.

Ответ №2:

Я чувствую, что ошибка немного вводит в заблуждение.

Тестовый пример фактически терпел неудачу из-за тела запроса, которое я устанавливал и утверждал. Тело запроса в моем случае представляет собой HTML-шаблон. И я пытался утвердить это с помощью неправильного HTML-шаблона.

Когда я использовал правильный HTML-шаблон, тестовый пример прошел.