2

こんにちは、メソッドを持つサービスが 1 つあります。

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

そして今、テストは緑色です! :) ありがとう

4

1 に答える 1

7

これが問題です:

ReCaptchaImpl reCaptcha = new ReCaptchaImpl();

それは単に新しいインスタンスを作成するだけです - モックはまったく使用されていません。モックを何にも渡していないことに注意してください-本番コードがそれをどのように使用することを期待していましたか?

モックは、注入された依存関係、またはファクトリによって返される依存関係でさえ、ファクトリにモックを返させることができますが、コンストラクターを呼び出すだけです。

これにはPowerMockを使用できますが、モックをまったく必要としないように再設計するか、依存関係をどこかに注入できるようにすることをお勧めします。

于 2013-10-31T21:45:41.623 に答える