Как издеваться над ресурсом Spring Message внутри другого макетного класса с помощью Mockito?

#java #spring #unit-testing #mockito

#java #spring #модульное тестирование #mockito

Вопрос:

В моем тесте, когда я утверждаю сообщение об исключении, я получаю null

Я не получаю макет сообщения внутри службы …. 🙁

У меня есть:

Мой тест:

 @RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {

    @InjectMocks
    private ServiceImpl service;

    @Mock
    private Message message;

    public static final String REQUIRED_FIELD = "required.field";

    @Before
    public void setUp() {
        when(message.getMessage(eq(REQUIRED_FIELD), any(List.class))).thenReturn(REQUIRED_FIELD);

        System.out.println(message.getMessage(REQUIRED_FIELD, new ArrayList()));
    }

    @Test(expected = MyException.class)
    public void testCancel_shouldValidCancellation_and_ThrowTicketException_with_RequiredFieldMessage() {
        try {
            Object object = //... new object
            service.do(object);
        } catch (Exception e) {
            assertEquals(REQUIRED_FIELD, e.getMessage()); // <-- e.getMessage return null!!!
        }
    }
}
  

Мой сервис:

 @Service
public class ServiceImpl implements Service {

    @Autowired
    Message message;

    @Override
    public Object do(Object object) {
        if(object.getSomeAttribute() == null)) {
            throw new MyException(message.getMessage("required.field", "attribute"));
        }

        //doSomething...
        return something;
    }
}
  

В setUp() of test printLn() печатает required.field , но я не могу использовать message of Service !!

Кто-нибудь может мне помочь?

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

1. private serviceImpl service; это опечатка или другой класс?

2. Извините, просто неправильно написал.. отредактировано 🙂

Ответ №1:

Трудно сказать наверняка, не зная интерфейса Message , но легко заметить, что вы настраиваете макет объекта на метод заглушки с подписью getMessage(String, List) :

 when(message.getMessage(eq(REQUIRED_FIELD), any(List.class))).thenReturn(REQUIRED_FIELD);
  

Однако ServiceImpl использует getMessage(String, String) . Значение по умолчанию, которое возвращается mock в этом случае, является null . Вы должны правильно настроить макет объекта.