{"id":6457,"date":"2022-07-17T15:26:31","date_gmt":"2022-07-17T07:26:31","guid":{"rendered":"http:\/\/123.57.164.21\/?p=6457"},"modified":"2022-07-17T18:35:41","modified_gmt":"2022-07-17T10:35:41","slug":"mockito-%e6%a8%a1%e6%8b%9f%e9%9d%99%e6%80%81%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=6457","title":{"rendered":"Mockito Mock Static \u65b9\u6cd5"},"content":{"rendered":"\n<p><strong>\u8bf4\u660e<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Java \u5355\u5143\u6d4b\u8bd5\u6700\u8d81\u624b\u7684 Mock \u7ec4\u4ef6\u5f53\u5c5e Mockito\uff0c\u867d\u7136\u5b83\u6700\u521d\u662f\u57fa\u4e8e\u7ee7\u627f\u6765\u5b9e\u73b0 Mock \u7684\uff0c\u6240\u4ee5\u5bf9\u79c1\u6709\u65b9\u6cd5\uff0c\u79c1\u6709\u5c5e\u6027\uff0c\u9759\u6001\u65b9\u6cd5\uff0cfinal \u7c7b\uff0cfinal \u65b9\u6cd5\uff0c\u6784\u9020\u51fd\u6570\u65e0\u80fd\u4e3a\u529b\u3002\u4e8e\u662f\u6709\u65f6\u4e0d\u5f97\u4e0d\u5f15\u5165 JMockit \u6216 PowerMockit \u6765\u8f85\u52a9\u3002\u4e0d\u8fc7\u73b0\u5728\u7684 Mockito \u529f\u529b\u6709\u6240\u589e\u5f3a\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u662f Mockito 2.1.0 \u5f00\u59cb\u53ef\u4ee5 Mock final \u7c7b\u548c final \u65b9\u6cd5\uff0c\u8981\u5728 classpath \u4e0b\u521b\u5efa\u4e2a\u6587\u4ef6 mockito-extensions\/org.mockito.plugins.MockMaker, \u5185\u5bb9\u4e3a mock-maker-inline\u3002\u4e4b\u524d\u5199\u8fc7\u4e00\u7bc7\u4ecb\u7ecd\uff1aMockto \u4e5f\u80fd Mock final \u7c7b\u548c final \u65b9\u6cd5\u4e86\uff0c\u5176\u4e2d\u4e5f\u63a2\u7d22\u4e86\u5b83\u7684\u5b9e\u73b0\u7ec6\u8282\uff0c\u4f7f\u7528\u5230\u4e86 ByteBuddy \u4fee\u6539\u5b57\u8282\u7801\u3002<\/p>\n\n\n\n<p>\u4ece <a href=\"https:\/\/github.com\/mockito\/mockito\/blob\/caac3535daaeb9370cd25f23694d3d059a72d8d9\/doc\/release-notes\/official.md#340\">Mockito 3.4.0<\/a> \u901a\u8fc7\u7c7b\u4f3c\u7684 mockto-extensions \u6269\u5c55\u7684\u65b9\u5f0f\uff0c\u5b9e\u73b0\u4e86\u5bf9\u9759\u6001\u65b9\u6cd5\u7684 Mock\u3002\u6240\u6709\u4f7f\u7528\u5230\u7684\u63a5\u53e3\u662f org.mockito.MockedStatic\uff0c\u5b83\u5f53\u524d\u5728 Mockito 3.7.7 \u4e2d\u8fd8\u662f\u4e00\u4e2a\u8bd5\u9a8c\u6027\u65b9\u6cd5 @Incubating\uff0c\u80fd\u62ff\u6765\u7528\u5c31\u884c\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>\u5bfc\u5165\u4f9d\u8d56<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u4ece3.4.0\u7248\u5f00\u59cb\uff0cMock\u9759\u6001\u65b9\u6cd5\u662fMockito\u7684\u4e00\u90e8\u5206\u3002 \u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fMaven\uff0c\u8bf7\u66f4\u65b0\u73b0\u6709\u7684Mockito\u7248\u672c\u6216\u5c06\u4ee5\u4e0b\u4f9d\u8d56\u9879\u5305\u542b\u5230pom.xml\u4e2d\uff1a<\/p>\n\n\n\n<p>\u5f15\u5165 mockito-inline&nbsp;\u4f9d\u8d56<\/p>\n\n\n\n<p>\u90a3\u4e48\u6765\u770b\u770b Mockito \u662f\u5982\u4f55 Mock&nbsp; \u9759\u6001\u65b9\u6cd5\uff0c\u7f51\u4e0a\u7684\u6587\u7ae0\u4e00\u822c\u662f\u8bf4\u8981\u7528 <code>mockito-inline<\/code> \u66ff\u6362 <code>mockito-core<\/code> \u4f9d\u8d56\uff0c\u4e5f\u5c31\u662f\u8981\u5728 pom.xml&nbsp;\u4e2d\u7684\u4f9d\u8d56\u7531\u901a\u5e38\u7684<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;dependency>\n    &lt;groupId>org.mockito&lt;\/groupId>\n    &lt;artifactId>mockito-core&lt;\/artifactId>\n    &lt;version>3.7.7&lt;\/version>\n    &lt;scope>test&lt;\/scope>\n&lt;\/dependency><\/pre>\n\n\n\n<p><strong>\u6362\u6210<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;dependency>\n    &lt;groupId>org.mockito&lt;\/groupId>\n    &lt;artifactId>mockito-inline&lt;\/artifactId>\n    &lt;version>3.7.7&lt;\/version>\n    &lt;scope>test&lt;\/scope>\n&lt;\/dependency><\/pre>\n\n\n\n<p>\u5176\u5b9e\u53ef\u4ee5\u770b\u51fa\u6765\uff0cmockito-inline\u5305\u542b\u4e86mockito-core<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11.png\" alt=\"\" class=\"wp-image-6470\" width=\"522\" height=\"271\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11.png 966w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-300x156.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-768x399.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-830x431.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-230x120.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-350x182.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u622a\u5c4f2022-07-17-17.32.11-480x249.png 480w\" sizes=\"(max-width: 522px) 100vw, 522px\" \/><\/figure><\/div>\n\n\n\n<p><br>\u90a3\u4e48\u7531 <code>mockito-core<\/code> \u5230 <code>mockito-inline<\/code> \u53d1\u751f\u4e86\u4ec0\u4e48\u5462\uff0c\u770b mockito-inline \u7684 <a href=\"https:\/\/repo1.maven.org\/maven2\/org\/mockito\/mockito-inline\/3.7.7\/mockito-inline-3.7.7.pom\">pom.xml<\/a> \u6587\u4ef6\u5c31\u77e5\u9053\uff0c\u5b83\u5176\u5b9e\u5185\u90e8\u4f9d\u8d56\u4e86 <code>mockito-core<\/code>\u3002\u4f7f\u7528\u4e86 <code>mockito-inline<\/code> \u540e\u6548\u679c\u5982\u4e0b\uff1a<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-1024x373.png\" alt=\"\" class=\"wp-image-6458\" width=\"552\" height=\"200\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-1024x373.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-300x109.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-768x280.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-830x302.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-230x84.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-350x127.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178-480x175.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-178.png 1450w\" sizes=\"(max-width: 552px) 100vw, 552px\" \/><\/figure><\/div>\n\n\n\n<p>\u5b9e\u8d28\u4e0a <code>mockito-inline<\/code> \u5c31\u662f\u7ed9 mockito-core \u6dfb\u52a0\u4e86\u4e24\u4e2a\u63d2\u4ef6\u914d\u7f6e\uff0c\u5206\u522b\u662f <code>org.mockito.plugins.MockMaker<\/code> \u548c <code>org.mockito.plugins.MemberAccessor<\/code>\uff0c\u800c\u524d\u8005\u4e5f\u662f\u7528\u4e8e Mock final \u7c7b\u548c final \u65b9\u6cd5\u7684\u3002\u81f3\u4e8e Mock \u9759\u6001\u65b9\u6cd5\u662f\u7531\u524d\u8005\u8fd8\u662f\u540e\u8005\u652f\u6301\u7684\u9700\u8981\u8fdb\u4e00\u6b65\u7814\u7a76\u3002<\/p>\n\n\n\n<p>\u8981\u662f\u4e0d\u60f3\u76f4\u63a5\u5f15\u5165 <code>mockito-inline<\/code> \u7684\u8bdd\uff0c\u81ea\u5df1\u5728 classpath \u4e0b\u521b\u5efa\u76f8\u540c\u7684\u6587\u4ef6\u53ca\u5176\u5185\u5bb9\u4e5f\u662f\u53ef\u4ee5\u7684\u3002<\/p>\n\n\n\n<p><strong>\u6d4b\u8bd5 Mock \u9759\u6001\u65b9\u6cd5<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u6709\u4e86 <code>mockito-inline<\/code> \u63a5\u7740\u5c1d\u8bd5\u4e0b\u7528\u4ee3\u7801\u5982\u4f55 Mock \u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\uff0c\u5148\u521b\u5efa\u4e00\u4e2a\u542b\u6709\u9759\u6001\u65b9\u6cd5\u7684\u5f85\u6d4b\u8bd5\u7c7b <code>Utils<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package yanbin.blog;\n \nimport java.time.LocalDate;\n \npublic class Utils {\n \n    public LocalDate getCurrentDate() {\n        return LocalDate.now();\n    }\n}<\/pre>\n\n\n\n<p>\u6d4b\u8bd5 UtilsTest<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package yanbin.blog;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.MockedStatic;\nimport org.mockito.Mockito;\nimport org.mockito.junit.MockitoJUnitRunner;\n\nimport java.time.LocalDate;\n\nimport static org.junit.Assert.assertEquals;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class UtilsTest {\n\n    private Utils target = new Utils();\n\n    @Test\n    public void testGetCurrentDate() {\n        LocalDate yearOf2000 = LocalDate.of(2000, 1, 1);\n        try (MockedStatic theMock = Mockito.mockStatic(LocalDate.class)) {\n            theMock.when(LocalDate::now).thenReturn(yearOf2000);\n\n            System.out.println(target.getCurrentDate());\n            assertEquals(2000, target.getCurrentDate().getYear());\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u901a\u8fc7\uff0c\u5f53\u524d\u65e5\u671f\u662f 2021-02-03, \u6253\u5370\u7684\u65e5\u671f\u662f 2000-01-01, \u53c8\u91cd\u56de\u5230\u4e86 2000 \u5e74\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u7528\u5230\u4e86&nbsp; <code>Mockito.mockStatic(LocalDate.class)<\/code> Mock \u4e86 LocalDate \u7684\u6240\u6709\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u5728\u5b83 try \u5757\u5916\u7aef\u8c03\u7528 LocalDate \u7684\u9759\u6001\u65b9\u6cd5\u662f\u53ef\u4ee5, \u5176\u95f4\u4e0d\u7528&nbsp;theMock.when(LocalDate::now).thenReturn(yearOf2000) \u800c\u76f4\u63a5\u8c03\u7528 LocalDate \u7684\u5176\u4ed6\u9759\u6001\u65b9\u6cd5\uff0c\u5982 LocalDate.of(2000, 1, 1) \u5219\u4f1a\u62a5\u9519\uff0c\u50cf\u4e0b\u9762\u7684\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Test\npublic void testGetCurrentDate() {\n    try (MockedStatic&lt;LocalDate> theMock = Mockito.mockStatic(LocalDate.class)) {\n        theMock.when(LocalDate::now).thenReturn(LocalDate.of(2000, 1, 1));\n \n        System.out.println(target.getCurrentDate());\n        assertEquals(2000, target.getCurrentDate().getYear());\n    }\n}\n<\/pre>\n\n\n\n<p>\u8fd0\u884c\u540e\u62a5\u9519<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-1024x571.png\" alt=\"\" class=\"wp-image-6461\" width=\"515\" height=\"287\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-1024x571.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-300x167.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-768x429.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-830x463.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-230x128.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-350x195.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179-480x268.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-179.png 1466w\" sizes=\"(max-width: 515px) 100vw, 515px\" \/><\/figure><\/div>\n\n\n\n<p>\u4e5f\u5c31\u662f\u8bf4\u7528 <code>try (MockedStatic theMock = Mockito.mockStatic(LocalDate.class)) { ... }<\/code> \u4e00\u65e6 Mock \u4e00\u4e2a\u7c7b\uff0c\u90a3\u4e48\u5b83\u6240\u6709\u7684\u9759\u6001\u65b9\u6cd5\u90fd\u88ab Mockito \u63a5\u7ba1\u3002<\/p>\n\n\n\n<p><strong>Mock&nbsp;\u5e26\u53c2\u6570\u7684\u9759\u6001\u65b9\u6cd5<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u524d\u9762 Mock \u662f\u4e0d\u5e26\u53c2\u6570\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u6ce8\u610f\u5230 <code>MockedStatic.when(Verification)<\/code> \u7684\u53c2\u6570\u662f\u4e00\u4e2a&nbsp; Verification\uff0c\u5b83\u662f\u4e00\u4e2a SAM \u63a5\u53e3<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">interface Verification {\n    void apply() throws Throwable;\n}<\/pre>\n\n\n\n<p>\u800c\u6211\u4eec\u901a\u5e38\u7528\u7684 Mockito.when(T methodCall) \u7684\u53c2\u6570\u662f\u4e00\u4e2a\u65b9\u6cd5\u8c03\u7528\u7684\u8fd4\u56de\u503c\uff0c\u6240\u4ee5\u5f53 Mock \u5e26\u53c2\u6570\u7684\u9759\u6001\u65b9\u6cd5\u65f6\u4e0e Mockito.when(obj.foo(1, 2)).thenReturn(34)) \u7684\u7528\u6cd5\u662f\u4e0d\u4e00\u6837\u7684\uff0cMockedStatic.when() \u7684\u53c2\u6570\u9700\u8981\u653e\u4e00\u4e2a () -&gt; LocalDate.of(anyInt(), anyInt(), anyInt()) \u8fd9\u6837\u7684 Lambda.&nbsp;\u5b8c\u6574\u4f8b\u5b50\u5982\u4e0b<\/p>\n\n\n\n<p>\u5148\u6539\u9020\u4e00\u4e0bUtils \u7c7b\uff0c\u4e3a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package yanbin.blog;\n \nimport java.time.LocalDate;\n \npublic class Utils {\n \n    public LocalDate getDate(int year, int month, int day) {\n        return LocalDate.of(year, month, day);\n    }\n}<\/pre>\n\n\n\n<p>\u518d\u5c31\u662f\u4e0b\u9762\u7684\u65b9\u5f0f Mock&nbsp;\u5e26\u53c2\u6570\u7684\u9759\u6001\u65b9\u6cd5<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RunWith(MockitoJUnitRunner.class)\npublic class UtilsTest {\n\n    private Utils target = new Utils();\n\n    @Test\n    public void testGetCurrentDate() {\n        LocalDate yearOf1970 = LocalDate.of(1970, 1, 1);\n        try (MockedStatic&lt;LocalDate> theMock = Mockito.mockStatic(LocalDate.class)) {\n            theMock.when(() -> LocalDate.of(anyInt(), anyInt(), anyInt())).thenReturn(yearOf1970);\n\n            System.out.println(target.getDate(2000, 2, 28));\n            assertEquals(1970, target.getDate(2000, 2, 28).getYear());\n            theMock.verify(()->LocalDate.of(anyInt(), anyInt(), anyInt()), times(1));\n        }\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">     theMock.when(() -> LocalDate.now()).thenReturn(yearOf1970); <\/pre>\n\n\n\n<p>\u5e76\u4e14\u6ce8\u610f\u5230\u4e0a\u9762\u7684\u7b2c 14 \u884c\uff0c\u5bf9\u9759\u6001\u65b9\u6cd5\u8c03\u7528\u7684 verify \u4e5f\u8981\u7528 theMock \u7684 verify() \u65b9\u6cd5\uff0c\u800c\u4e0d\u662f Mockito.verify()\u3002<\/p>\n\n\n\n<p>\u4e00\u5f20\u56fe\u5927\u6982\u770b\u4e00\u4e0b\u5b83\u7684\u5185\u90e8\u5b9e\u73b0:  \u53ef\u4ee5\u770b\u51fa\u4e5f\u662f\u7528\u7684 ByteBuddy<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-1024x496.png\" alt=\"\" class=\"wp-image-6464\" width=\"544\" height=\"263\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-1024x496.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-300x145.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-768x372.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-1536x744.png 1536w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-830x402.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-230x111.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-350x170.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180-480x233.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-180.png 1668w\" sizes=\"(max-width: 544px) 100vw, 544px\" \/><\/figure><\/div>\n\n\n\n<p>\u518d\u6d4b\u8bd5\u4e00\u4e0b\u662f\u54ea\u4e2a Mockito \u7684\u63d2\u4ef6\u5728\u8d77\u4f5c\u7528<\/p>\n\n\n\n<p>\u6211\u4eec\u628a\u4f9d\u8d56\u4ece <code>mockito-inline<\/code> \u6062\u590d\u5230 <code>mockito-core<\/code>, \u7136\u540e\u5728 classpath \u4e0b\u81ea\u5df1\u521b\u5efa <code>mockito-extensions\/org.mockito.plugins.MockMaker<\/code> \u5e76\u5185\u5bb9<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">     mock-maker-inline <\/pre>\n\n\n\n<p>\u91cd\u65b0\u8fd0\u884c\u6700\u524d\u9762\u7684 UtilsTest, \u6d4b\u8bd5\u901a\u8fc7\uff0c\u8bf4\u660e <code>mock-maker-inline<\/code> \u540c\u65f6\u652f\u6491\u4e86\u5bf9 final \u7c7b\uff0cfinal \u65b9\u6cd5\u548c\u9759\u6001\u65b9\u6cd5\u7684 Mock\u3002\u90a3\u5c31\u662f\u8bf4\u660e <code>mockito-extensions\/org.mockito.plugins.MemberAccessor<\/code> \u7684 <code>member-accessor-module<\/code> \u589e\u5f3a\u4e86 Mockito \u7684\u5176\u4ed6\u7279\u6027\uff0c\u521d\u6b65\u731c\u6d4b\u662f\u53ef\u7528\u6765\u66ff\u6362\u6d4b\u8bd5\u7c7b\u7684\u5185\u90e8\u6210\u5458\u5c5e\u6027\u503c\u3002<\/p>\n\n\n\n<p><strong>Mockito Mock&nbsp;\u9759\u6001\u65b9\u6cd5\u7684\u5f0a\u7aef<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u5728\u5b9e\u9645\u5e94\u7528 Mockito \u5bf9\u9759\u6001\u65b9\u6cd5\u8fdb\u884c Mock \u7684\u65f6\u5019\uff0c\u53d1\u73b0\u5728\u591a\u7ebf\u7a0b\u7684\u65f6\u5019\u5931\u6548\uff0c\u95ee\u9898\u5728\u4e8e\u5f53\u7528<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try (MockedStatic&lt;LocalDate> theMock = Mockito.mockStatic(LocalDate.class)) {\n    \/\/ \u53ea\u5bf9\u5f53\u524d\u7ebf\u7a0b\u6709\u6548\n}<\/pre>\n\n\n\n<p>\u53ea\u5bf9\u5f53\u524d\u7ebf\u7a0b\u5bf9 LocalDate \u9759\u6001\u65b9\u6cd5\u7684\u8c03\u7528\u6709\u6548\uff0c\u770b\u4e0b\u9762\u7684\u4f8b\u5b50\u5c31\u77e5\u9053<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Test\npublic void testGetCurrentDate() throws InterruptedException {\n    LocalDate yearOf2000 = LocalDate.of(1970, 1, 1);\n    try (MockedStatic&lt;LocalDate> theMock = Mockito.mockStatic(LocalDate.class)) {\n        theMock.when(LocalDate::now).thenReturn(yearOf2000);\n \n        System.out.println(Thread.currentThread().getName() + \":\" + LocalDate.now()); \/\/main:1970-01-01\n \n        Thread thread = new Thread(() ->\n            System.out.println(Thread.currentThread().getName() + \":\" + LocalDate.now()) \/\/Thread-0:2021-06-18\uff0c\u5bf9\u4e8e\u975e\u5f53\u524d\u7ebf\u7a0b\u65e0\u6548\n        );\n        thread.start();\n        thread.join();\n \n        System.out.println(Thread.currentThread().getName() + \":\" + LocalDate.now()); \/\/main:1970-01-01\n    }\n    System.out.println(Thread.currentThread().getName() + \":\" + LocalDate.now()); \/\/main:2021-06-18, \u9000\u51fa try block \u540e\u5f53\u7136\u4e5f\u5931\u6548\n}<\/pre>\n\n\n\n<p>\u8f93\u51fa\u4e3a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">main:1970-01-01\nThread-0:2021-06-18\nmain:1970-01-01\nmain:2021-06-18 <\/pre>\n\n\n\n<p>\u56e0\u4e3a\u8fd9\u4e00\u9650\u5236\uff0c\u51e0\u4e4e\u8ba9 Mockito mock \u9759\u6001\u65b9\u6cd5\u8fd9\u4e00\u8868\u73b0\u6de1\u7136\u65e0\u8272\uff0c\u5728\u5b9e\u9645\u5e94\u7528\u4ee3\u7801\u4e2d\u7ebf\u7a0b\u7684\u4f7f\u7528\u662f\u975e\u5e38\u666e\u904d\u7684\u3002\u770b\u6765\u5076\u7136\u95f4\u53d1\u73b0\u7684\u4eae\u70b9\u8fd8\u5f97\u653e\u5f03\u6389\u3002<\/p>\n\n\n\n<p><strong>\u9644\uff1aMockito \u53e6\u4e00\u79cd\u6a21\u62df\u9759\u6001\u65b9\u6cd5\u7684\u4f8b\u5b50<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<ul><li>\u5728\u6d4b\u8bd5\u7c7b\u4e0a\u6dfb\u52a0@ExtendWith(MockitoExtension.class)<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181.png\" alt=\"\" class=\"wp-image-6476\" width=\"446\" height=\"144\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181.png 824w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181-300x97.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181-768x248.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181-230x74.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181-350x113.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/07\/\u56fe\u7247-181-480x155.png 480w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/figure><\/div>\n\n\n\n<ul><li>\u5177\u4f53\u7684\u6d4b\u8bd5\u65b9\u6cd5\u64cd\u4f5c\u5982\u4e0b<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> Mockito.mockStatic(AppUserUtil.class);\n when(AppUserUtil.getLoginAppUser()).thenReturn(user);\n \n \u5176\u4e2dAppUserUtil\u662f\u5de5\u5177\u7c7b\uff0cgetLoginAppUser\u662f\u9759\u6001\u65b9\u6cd5<\/pre>\n\n\n\n<p>\u53e6\u5916 Mock\u9759\u6001\u65b9\u6cd5\u548cMock\u666e\u901a\u65b9\u6cd5\u53ef\u4ee5\u4e00\u8d77\u4f7f\u7528\uff0c\u4e0d\u4f1a\u6709\u6240\u51b2\u7a81<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8bf4\u660e Java \u5355\u5143\u6d4b\u8bd5\u6700\u8d81\u624b\u7684 Mock \u7ec4\u4ef6\u5f53\u5c5e Mockito\uff0c\u867d\u7136\u5b83\u6700\u521d\u662f\u57fa\u4e8e\u7ee7\u627f\u6765\u5b9e\u73b0 Mock \u7684 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/6457"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6457"}],"version-history":[{"count":12,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/6457\/revisions"}],"predecessor-version":[{"id":6479,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/6457\/revisions\/6479"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}