{"id":801,"date":"2013-10-23T04:55:18","date_gmt":"2013-10-23T11:55:18","guid":{"rendered":"http:\/\/10kdev.net\/?p=801"},"modified":"2013-10-23T04:58:39","modified_gmt":"2013-10-23T11:58:39","slug":"a-decent-mockito-verify-example","status":"publish","type":"post","link":"http:\/\/10kdev.net\/?p=801","title":{"rendered":"A Decent Mockito.verify Example"},"content":{"rendered":"<p>I always get confused as to when it would be a good time to use verify. I also see verify thrown into tests for no reason at all, except maybe as a practice to remember the syntax. I had written a Spring validation class and a test, and since Errors is an <em>interface<\/em> and is more easily used in tests as a mock (IMHO) I thought it a good spot to do a verify for the test instead of the usual assertsEquals or whatever.<\/p>\n<p>The rule is, for an object add, the objectId must be null or else I return a validation error.<\/p>\n<p>The calling Spring (3.2) controller method:<\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@ApiOperation<span style=\"color: black;\">(value = <span style=\"color: #2a00ff;\">&#8220;add new object&#8221;<span style=\"color: black;\">)<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #646464;\">@RequestMapping<span style=\"color: black;\">(method = RequestMethod.<span style=\"color: #0000c0;\"><em>PUT<\/em><span style=\"color: black;\">)<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #646464;\">@ResponseBody<\/span><br \/>\n<\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> ObjectAdd add(<span style=\"color: #646464;\">@Valid<span style=\"color: black;\"><br \/>\n<span style=\"color: #646464;\">@RequestBody<span style=\"color: black;\"> Object object) {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>return\u00a0<\/strong><span style=\"color: black;\"><span style=\"color: #0000c0; font-size: 10pt;\">objectService<\/span><span style=\"color: black;\">.add(object);<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> }<\/span><\/p>\n<p>Here&#8217;s my validation class. What it does is ensure there wasn&#8217;t an ID submitted to my PUT method \u2013 help the UI people out a little I know that get&#8217;s confusing. Also, if we make our rest API public this will help and . . it&#8217;s just good practice.<\/p>\n<p>The test we&#8217;ll write is on this class, to confirm it is checking for a null ID value. We&#8217;ll confirm that the Error object method either get&#8217;s called, or doesn&#8217;t, depending on if the ID is null or not (remember we are in ADD mode so we do not want an ID).<\/p>\n<p><span style=\"color: #646464; font-family: Consolas; font-size: 10pt;\">@Component<span style=\"color: black;\">(<span style=\"color: #2a00ff;\">&#8220;objectValidator&#8221;<span style=\"color: black;\">)<\/span><br \/>\n<\/span><\/span><\/span><\/p>\n<p><span style=\"color: #7f0055; font-family: Consolas; font-size: 10pt;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\"> ObjectValidator <span style=\"color: #7f0055;\"><strong>implements<\/strong><span style=\"color: black;\"> Validator {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Value<span style=\"color: black;\">(<span style=\"color: #2a00ff;\">&#8220;${object.Id}&#8221;<span style=\"color: black;\">)<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> String <span style=\"color: #0000c0;\">idName<span style=\"color: black;\">;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Value<span style=\"color: black;\">(<span style=\"color: #2a00ff;\">&#8220;${object.add.empty.id}&#8221;<span style=\"color: black;\">)<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> String <span style=\"color: #0000c0;\">idError<span style=\"color: black;\">;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@SuppressWarnings<span style=\"color: black;\">(<span style=\"color: #2a00ff;\">&#8220;rawtypes&#8221;<span style=\"color: black;\">)<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Override<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>boolean<\/strong><span style=\"color: black;\"> supports(Class clazz) {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>return<\/strong><span style=\"color: black;\"> Object.<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\">.isAssignableFrom(clazz);<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\"> }<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Override<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> validate(Object target, Errors errors) {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Object object = (Object) target;<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>if<\/strong><span style=\"color: black;\"> (<span style=\"color: #7f0055;\"><strong>null<\/strong><span style=\"color: black;\"> != object.getObjectId()) {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 errors.rejectValue(<span style=\"color: #0000c0;\">idName<span style=\"color: black;\">, <span style=\"color: #0000c0;\">idError<span style=\"color: black;\">);<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">}<\/span><\/p>\n<p>Here&#8217;s the pojo, Jacksonfied because it comes in via a Controller and @Valid is used on the @Request:<\/p>\n<p><span style=\"color: #646464; font-family: Consolas; font-size: 10pt;\">@JsonTypeInfo<span style=\"color: black;\">(use = <span style=\"color: #646464;\">JsonTypeInfo<span style=\"color: black;\">.Id.<span style=\"color: #0000c0;\"><em>NAME<\/em><span style=\"color: black;\">, include = <span style=\"color: #646464;\">JsonTypeInfo<span style=\"color: black;\">.As.<span style=\"text-decoration: underline;\"><em>WRAPPER_OBJECT<\/em><\/span>)<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: #646464; font-family: Consolas; font-size: 10pt;\">@JsonTypeName<span style=\"color: black;\">(<span style=\"color: #2a00ff;\">&#8220;object&#8221;<span style=\"color: black;\">)<\/span><br \/>\n<\/span><\/span><\/span><\/p>\n<p><span style=\"color: #7f0055; font-family: Consolas; font-size: 10pt;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\"> Object<\/span><br \/>\n<\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #646464;\">@JsonProperty<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> Integer <span style=\"color: #0000c0;\">objectId<span style=\"color: black;\">;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #646464;\">@JsonProperty<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> String <span style=\"color: #0000c0;\">objectText<span style=\"color: black;\">;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #646464;\">@JsonProperty<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> Date <span style=\"color: #0000c0;\">createDate<span style=\"color: black;\">;<br \/>\n<\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"> Object()<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #3f7f5f;\">\/\/ no-<span style=\"text-decoration: underline;\">arg<\/span> constructor for <span style=\"text-decoration: underline;\">Jackson<\/span><\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"> Integer getObjectId()<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>return\u00a0<\/strong><span style=\"color: black;\"><span style=\"color: #0000c0; font-size: 10pt;\">objectId<\/span><span style=\"color: black;\">;<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> setObjectId(Integer objectId)<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>this<\/strong><span style=\"color: black;\">.<span style=\"color: #0000c0;\">objectId<span style=\"color: black;\"> = objectId;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"> String getObjectText()<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>return<\/strong><span style=\"color: black;\"> objectText;<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public\u00a0<\/strong><span style=\"color: black;\"><strong style=\"color: #7f0055; font-size: 10pt;\">void<\/strong><span style=\"color: black;\"> setObjectText (String objectText)<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>this<\/strong><span style=\"color: black;\">.objectText = objectText;<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"> Date getCreateDate()<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>return\u00a0<\/strong><span style=\"color: black;\"><span style=\"color: #0000c0; font-size: 10pt;\">createDate<\/span><span style=\"color: black;\">;<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>public\u00a0<\/strong><span style=\"color: black;\"><strong style=\"color: #7f0055; font-size: 10pt;\">void<\/strong><span style=\"color: black;\"> setCreateDate(Date createDate)<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0{<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #7f0055;\"><strong>this<\/strong><span style=\"color: black;\">.<span style=\"color: #0000c0;\">createDate<span style=\"color: black;\"> = createDate;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0}<br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">}<\/span><\/p>\n<p>And here&#8217;s my unit test with verification:<\/p>\n<p><span style=\"color: #7f0055; font-family: Consolas; font-size: 10pt;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\"> ObjectValidatorTest {<\/span><br \/>\n<\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@InjectMocks<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> ObjectValidator <span style=\"color: #0000c0;\">objectValidator<span style=\"color: black;\"> = <span style=\"color: #7f0055;\"><strong>new<\/strong><span style=\"color: black;\"> ObjectValidator();<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #646464;\">@Mock<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>private<\/strong><span style=\"color: black;\"> Errors <span style=\"color: #0000c0;\">mockErrors<span style=\"color: black;\">;<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Before<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> setUp() <span style=\"color: #7f0055;\"><strong>throws<\/strong><span style=\"color: black;\"> Exception {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0MockitoAnnotations.<em>initMocks<\/em>(<span style=\"color: #7f0055;\"><strong>this<\/strong><span style=\"color: black;\">);<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\"> }<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@<span style=\"background-color: lightgrey;\">After<\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> tearDown() <span style=\"color: #7f0055;\"><strong>throws<\/strong><span style=\"color: black;\"> Exception {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\"> }<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Test<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> testValidate() {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0Object object = <span style=\"color: #7f0055;\"><strong>new<\/strong><span style=\"color: black;\"> Object();<\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0object.setObjectId(<span style=\"color: #7f0055;\"><strong>null<\/strong><span style=\"color: black;\">);<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000c0;\">objectValidator<span style=\"color: black;\">.validate(object, <span style=\"color: #0000c0;\">mockErrors<span style=\"color: black;\">);<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<em>verify<\/em>(<span style=\"color: #0000c0;\">mockErrors<span style=\"color: black;\">, <em>times<\/em>(0)).rejectValue(<em>anyString<\/em>(),<em>anyString<\/em>());<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\">\u00a0\u00a0\u00a0\u00a0object.setObjectId(44); <\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000c0;\">objectValidator<span style=\"color: black;\">.validate(object, <span style=\"color: #0000c0;\">mockErrors<span style=\"color: black;\">);<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<em>verify<\/em>(<span style=\"color: #0000c0;\">mockErrors<span style=\"color: black;\">, <em>times<\/em>(1)).rejectValue(<em>anyString<\/em>(),<em>anyString<\/em>());<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\"> }<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<span style=\"color: #646464;\">@Test<\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"> <span style=\"color: #7f0055;\"><strong>public<\/strong><span style=\"color: black;\"><br \/>\n<span style=\"color: #7f0055;\"><strong>void<\/strong><span style=\"color: black;\"> testSupports() {<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<em>assertTrue<\/em>(<span style=\"color: #0000c0;\">objectValidator<span style=\"color: black;\">.supports(Object.<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\">));<\/span><br \/>\n<\/span><\/span><\/span><\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">\u00a0\u00a0\u00a0\u00a0<em>assertFalse<\/em>(<span style=\"text-decoration: underline;\">objectValidator<\/span>.supports(String.<span style=\"color: #7f0055;\"><strong>class<\/strong><span style=\"color: black;\">));<\/span><br \/>\n<\/span><\/span><\/p>\n<p><span style=\"font-family: Consolas; font-size: 10pt;\"><span style=\"color: black;\"> }<\/span><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\"><br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">I think this makes a lot of sense. We aren&#8217;t testing Errors itself, just if our validation methods logic calls Errors or ignores it in the correct situations.<br \/>\n<\/span><\/p>\n<p><span style=\"color: black; font-family: Consolas; font-size: 10pt;\">One thing to force ourselves to really think about when writing mock tests is &#8220;what are we really testing.&#8221; A lot of times I get errors, forgetting &#8220;ah, yeah even that service had to be mocked.&#8221; Verification can help us test our class that has a mock component.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I always get confused as to when it would be a good time to use verify. I also see verify thrown into tests for no reason at all, except maybe as a practice to remember the syntax. I had written a Spring validation class and a test, and since Errors is an interface and is [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/801"}],"collection":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=801"}],"version-history":[{"count":4,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/801\/revisions"}],"predecessor-version":[{"id":805,"href":"http:\/\/10kdev.net\/index.php?rest_route=\/wp\/v2\/posts\/801\/revisions\/805"}],"wp:attachment":[{"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=801"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/10kdev.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}