Перемешанный метод не вызывается в Mockito

Здравствуйте, у меня есть один сервис с методом:

@Service
public class CaptchaServiceImpl implements CaptchaService {

@Autowired
private MessageSource messageSource;

@Override
public boolean processCaptcha(String requestedUrl, String challenge, String userResponse) {

    ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
    reCaptcha.setPrivateKey(messageSource.getMessage("reCaptcha.private.key", new Object[]{}, new Locale("pl", "PL")));
    ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(requestedUrl, challenge, userResponse);

    return reCaptchaResponse.isValid();
}

}

и я написал тест для этого:

@RunWith(MockitoJUnitRunner.class)
public class CaptchaServiceImplTest {

private CaptchaService captchaService;

@Mock
private MessageSource messageSource;

@Mock
private ReCaptchaImpl reCaptcha;

@Before
public void init() {
    captchaService = new CaptchaServiceImpl();
    ReflectionTestUtils.setField(captchaService, "messageSource", messageSource);
}

@Test
public void shouldPassReCaptchaValidation() {
    ReCaptchaTestResponse captchaResponse = new ReCaptchaTestResponse(true, "no errors");
    when(messageSource.getMessage("reCaptcha.private.key", new Object[]{}, new Locale("pl", "PL"))).thenReturn("reCaptcha.private.key");
    when(reCaptcha.checkAnswer(anyString(), anyString(), anyString())).thenReturn(captchaResponse);

    boolean reCaptchaResponse = captchaService.processCaptcha("url", "challenger", "userResponse");

    assertThat(reCaptchaResponse, is(true));
}

private class ReCaptchaTestResponse extends ReCaptchaResponse {

    protected ReCaptchaTestResponse(boolean valid, String errorMessage) {
        super(valid, errorMessage);
    }
}

}

ReCaptchaResponse является защищенным классом...

Поэтому, когда я запускаю тест, я получаю:

 java.lang.AssertionError: 
 Expected: is <true>
 got: <false>

По какой-то причине мой смоделированный метод checkAnswer никогда не вызывается, а мой объект captchaResponse никогда не возвращается, и у меня закончились идеи почему. Может ли кто-нибудь сказать мне, почему это происходит? Может быть, мне чего-то не хватает:/

ОБНОВИТЬ:

Итак, я обновил мой CaptchaService:

@Autowired
private ReCaptchaImpl reCaptcha;

@Override
public boolean processCaptcha(String requestedUrl, String challenge, String userResponse) {
    reCaptcha.setPrivateKey(messageSource.getMessage("reCaptcha.private.key", new Object[]{}, new Locale("pl", "PL")));
    ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(requestedUrl, challenge, userResponse);

    return reCaptchaResponse.isValid();
}

а теперь тест зеленый!:) Спасибо

1 ответ

Решение

Это проблема:

ReCaptchaImpl reCaptcha = new ReCaptchaImpl();

Это просто создание нового экземпляра - ваш макет вообще не используется. Обратите внимание, что вы не передаете свой макет во что-либо - как вы ожидали, что рабочий код будет его использовать?

Mocks хороши для вставленных зависимостей или даже зависимостей, которые возвращаются фабрикой, где вы можете заставить фабрику возвращать mock для вас - но вы просто вызываете конструктор.

Вы можете использовать PowerMock для этого, но я бы предложил изменить дизайн, чтобы вообще не нуждаться в макете, или чтобы где-то вводить зависимость.

Другие вопросы по тегам