Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

在本教程中,我们将介绍使用Mockito的常用情况ArgureCaptor.在我们的单位测试中。

或者,对于其他mockito.verify.用例,看看我们的Mockito验证食谱。

2.使用ArgureCaptor.

ArgureCaptor.允许我们捕获传递给方法的参数以检查它。这当我们无法访问我们想要测试的方法之外的参数时特别有用。

例如,考虑一个EmailService.课堂与A.发送我们想测试的方法:

公共类EmailService {私人DeliverationPlatform平台;公共电子邮件服务(DirectionPlatform平台){this.platform =平台;公共void发送(字符串到,字符串主题,字符串正文,布尔HTML){格式格式= format.text_only;if(html){format = format.html;电子邮件电子邮件=新电子邮件(至,主体,身体);电子邮件.setFormat(格式);platform.deliver(电子邮件);} ...}

EmailService.发送,注意搞大platform.deliver.拿一个新的电子邮件作为一个论点。作为我们测试的一部分,我们想检查新的格式字段电子邮件设定为format.html.。为此,我们需要捕获并检查传递给的参数platform.deliver.

让我们看看我们如何使用ArgureCaptor.帮助我们。

2.1。设置单位测试

首先,让我们创建我们的单位测试类:

@runwith(mockitojunitrunner.class)public类memodserviceunittest {@mock deliveryplatform平台;@InjectMocks电子邮件emailService;...}

我们正在使用@嘲笑注释嘲笑deliveryplatform.,它自动注入我们的EmailService.与之@injectmocks.注解。请参阅我们的Mockito注释关于更多细节的文章。

2.2。加一个ArgureCaptor.场地

其次,让我们添加一个新的ArgureCaptor.类型的领域电子邮件要存储我们捕获的参数:

@Captor ArgumentCaptor <电子邮件> EmailCaptor;

2.3。捕获论点

第三,让我们使用mockito.verify.与之ArgureCaptor.捕捉电子邮件

mockito.verify(平台).deliver(EmailCaptor.Capture());

然后我们可以获得捕获的值并将其存储为一个新的电子邮件目的:

电子邮件电子邮件CopTorValue = EmailCaptor.getValue();

2.4。检查捕获的值

最后,让我们看到整个测试用断言检查捕获电子邮件目的:

@test public void whendoessupporthtml_expecthtmlemailformat(){string to =“[电子邮件受保护]“;字符串主题=”使用ArgumentCaptor“; String Body =”hey,Let'USE ArgumentCaptor“; EmailService.Send(to,主题,正文,true); mockito.verify(平台).deliver(EmailCaptor.Capture());电子邮件值= EmailCaptor.getValue(); assertequals(format.html,value.getformat());}

3.避免断筋

虽然我们可以使用ArgureCaptor.用短管我们通常应该避免这样做。为了在Mockito澄清,这通常意味着避免使用ArgureCaptor.Mockito.han.。用短管,我们应该使用ArgumentMatcher.反而。

让我们看几个原因,为什么我们应该避免存根。

3.1。减少测试可读性

首先,考虑一个简单的测试

凭据凭据=新凭据(“baeldung”,“trick_password”,“trick金宝搏188体育_key”);Mockito.When(platform.authenticate(mockito.eq(凭据))).thenreturn(authenticationstatus.authenticated);asserttrue(emailservice.authenticedSuccescess(凭据));

在这里,我们使用Mockito.eq(凭据)要指定Mock应返回对象时。

接下来,考虑使用相同的测试ArgureCaptor.反而:

凭据凭据=新凭据(“baeldung”,“trick_password”,“trick金宝搏188体育_key”);Mockito.When(platform.authenticate(credentialscaptor.capture())).thenreturn(sustreationstatus.authenticated);asserttrue(emailservice.authenticedSuccescess(凭据));assertequals(凭据,credentialscaptor.getvalue());

与第一次测试相比,请注意我们如何在最后一行中执行额外的断言,以便这样做Mockito.eq(凭据)

最后,注意到它是如何立即清除什么CredentialScaptor.Capture()是指的。这是因为我们必须在我们使用它的行之外创建备用子,这降低了可读性。

3.2。减少缺陷本土化

另一个原因是,如果EmailService.AuthenticatedSuccesclease不打电话platform.authenticate.,我们会得到一个例外:

org.mockito.exceptions.base.mockitoException:没有参数值被捕获!

这是因为我们的Stubbed方法没有捕获参数。但是,实际问题不在我们的测试本身,但我们正在测试的实际方法。

换句话说,它误导了我们在测试中的例外,而实际的缺陷是我们正在测试的方法中。

4。结论

在这篇简短的教程中,我们看了一般用例ArgureCaptor.。我们也看着避免使用的原因ArgureCaptor.用短管。像往常一样,我们的所有代码样本都可提供在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!