Mockito在if语句中模拟函数调用

时间:2018-12-06 16:31:55

标签: java spring unit-testing mockito

我正在尝试模拟对驻留在if语句中的外部api的函数调用。我无法返回在.thenReturn中拥有的值,并且不确定为什么。我一直在寻找有关此问题的答案,但似乎找不到任何能回答我问题的答案。感谢您的宝贵时间!

这是我正在测试的班级:

@Service
public class TwilioVerifyService {

    public String requestCode(String phoneNumber, String countryCode, String via) throws AuthyException
    {
        AuthyApiClient authyApiClient = new AuthyApiClient("<apiClient>");

        Params params = new Params();
        params.setAttribute("code_length", "6");
        Verification verification = authyApiClient
            .getPhoneVerification()
            .start(phoneNumber, countryCode, via, params);
        if (verification.isOk())
        {
            return "{ \"success\": \"Successfully sent verification code.\" }";
        }
        return "{ \"error\": \"Error sending code.\" }";
    }
}

这是我的测试:

@RunWith(MockitoJUnitRunner.class)
public class TwilioVerifyServiceTests {

    @InjectMocks
    TwilioVerifyService twilioVerifyService;

    @Mock
    Verification verification;

    @Test
    public void requestCodeTest_success() throws AuthyException
    {
        String phoneNumber = "1111111111";
        String countryCode = "1";
        String via = "1";
        when(verification.isOk()).thenReturn(true);

        String result = twilioVerifyService.requestCode(phoneNumber, countryCode, via);
        System.out.println(result);
    }
}

我相信我正在(或想成为)嘲笑verification.isOk()返回true而不考虑输入,但是提供"{ "error": "Error sending code." }"而不是"{ \"success\": \"Successfully sent verification code.\" }"似乎返回false。 / p>

再次感谢您的时间!

1 个答案:

答案 0 :(得分:0)

验证是通过对AuthyApiClient中的方法的调用生成的。

理想情况下,不应在您的服务中实例化AuthyApiClient,而应由调用者将其注入其中。

private AuthyApiClient authyApiClient;
@Autowired
public TwilioVerifyService(AuthyApiClient authyApiClient) {
  this.authyApiClient = authyApiClient;
}

然后,您可以模拟authyApiClient并将其传递给要测试的类: TwilioVerifyService twilioVerifyService =新的TwilioVerifyService(mockAuthyApiClient);

这使您可以更好地控制要测试的类,并删除当前对AuthyApiClient构造函数的依赖。