2

您好,我有一个服务方法:

@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 对象也从未返回,我已经没有想法为什么了。有人可以告诉我为什么会这样吗?也许我错过了一些东西:/

更新:

所以我更新了我的验证码服务:

@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();
}

现在测试是绿色的!:) 谢谢

4

1 回答 1

7

这就是问题:

ReCaptchaImpl reCaptcha = new ReCaptchaImpl();

这只是创建一个新实例 - 你的模拟根本没有被使用。请注意您没有将模拟传递给任何东西 - 您希望生产代码如何使用它?

模拟适用于注入的依赖项,甚至是工厂返回的依赖项,您可以让工厂为您返回模拟 - 但您只是在调用构造函数。

可以为此使用PowerMock,但我建议重新设计以完全避免需要模拟,或者允许在某处注入依赖项。

于 2013-10-31T21:45:41.623 回答