当前位置: 首页 > 知识库问答 >
问题:

如何使用Mockito。在静态方法上验证()?

云欣嘉
2023-03-14

我正在Junit上工作

public class SocialDataAccessController implements Controller{

private SocialAuthServiceProvider socialAuthServiceProvider;

@Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        String provider = request.getParameter("pId");
        String appCode =  request.getParameter("apc");

         * check if data in session is of the same provider orof different
         * provider, if different then remove auth and request token
         **/

        SocialUtility.removeOtherProviderAuthTokenFromSession(request,provider);

        try {
            /** creating the OAuthService object based on provider type **/
            OAuthService service = getSocialAuthServiceProvider().getOAuthServiceProvider(appCode, provider);
            .....
            ........
            ............            
return new ModelAndView("redirect:callback.html?pId=" + provider);
    }

public SocialAuthServiceProvider getSocialAuthServiceProvider() {
        return socialAuthServiceProvider;
    }

}

这就是我所做的。我已发出请求,并且我的请求已成功调用我的控制器。当我尝试使用Mockito时。verify()要测试是否调用了静态方法,我得到一个错误,如下所示。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(
        locations={
            "file:/opt/div/BatchWorkspace/harvest_branch/WebContent/WEB-INF/test-servlet.xml"
        }
)

public class TestSocialDataAccessController {   
    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();      
    }


    @SuppressWarnings("static-access")
    @Test
    public void testBasicSetUp() throws Exception{
        RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/social-connect.html")
                .param("apc","tj")
                .param("src","google")
                .param("pId","ggl")
                .param("cl","xxxxxxxxxxxxxx");

        mockMvc.perform(requestBuilder)
       .andDo(MockMvcResultHandlers.print())
       .andExpect(MockMvcResultMatchers.status().isMovedTemporarily())
       .andExpect(MockMvcResultMatchers.redirectedUrl("xxxxxxxx"));

           SocialUtility sutil = new SocialUtility();
           SocialUtility spy = Mockito.spy(sutil);
           MockHttpServletRequest request = requestBuilder.buildRequest(wac.getServletContext());
           Mockito.verify(spy).removeOtherProviderAuthTokenFromSession(request,Matchers.anyString());          

    }
}

我得到的错误是:

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at com.tj.harvest.testcase.TestSocialDataAccessController.testBasicSetUp(TestSocialDataAccessController.java:88)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.

    at com.tj.harvest.testcase.TestSocialDataAccessController.testBasicSetUp(TestSocialDataAccessController.java:89)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597).

我的问题是:

>

  • 我可以使用Mockito.verify()在我的方法撤除其他提供者AuthTokenFrom会话(请求,提供者)。如果"是"如何?

    我还想在getOAuthServiceProvider(appCode,提供者)上使用验证。我该怎么做呢?

    任何帮助都是值得赞赏的。

  • 共有3个答案

    蒯宇定
    2023-03-14

    关于你的第二个问题:

    我还想在getOAuthServiceProvider(appCode,provider)上使用verify。我该怎么做?

    答案可能是这样的:

    Mockito.verify(this.getSocialAuthServiceProvider())
           .getOAuthServiceProvider(Mockito.isA(String.class), Mockito.isA(String.class));
    

    如果我错过了什么,请告诉我。

    秦胡媚
    2023-03-14

    >

    PowerMockito.doNothing().when(SocialUtility.class,
                                  "removeOtherProviderAuthTokenFromSession", 
                                  any(MockHttpServletRequest.class),
                                  anyString());
    

    您可以模拟您的getSocialAuthServiceProvider()或在调用SocialDataAccessController

    太叔景同
    2023-03-14

    使用Mockito验证静态方法-

    如果该方法具有参数,并且您希望对其进行验证,则将通过以下方式对其进行验证:

    @Test
    void testMethod() {
      try (MockedStatic<StaticProperties> theMock = Mockito.mockStatic(StaticProperties.class)) {
        theMock.when(StaticProperties.getProperty("abc", "xyz", "lmn"))).thenReturn("OK");
    
        //code .....
    
        theMock.verify(() -> StaticProperties.getProperty("abc", "xyz", "lmn"));
      }
      
    }
    
     类似资料:
    • 问题内容: 我正在使用以下内容。 这是我的utils课 这是被测课程的要点: 这是测试: 以上测试失败。给出的验证模式为空,但根据代码,如果订购成功,则必须发送电子邮件。 问题答案: 如果您要嘲笑行为(类似),则实际上无需调用。也就是说,这是我重写测试方法的动力: 我分为四个部分,以更好地突出显示正在发生的事情: 1.变量 我选择在此处声明任何实例变量/方法参数/模拟协作者。如果它在多个测试中使用

    • 我试图验证在使用powerMockito 1.6.4测试服务方法时从未调用过静态方法 我按照这个答案做了同样的事情。 以下是我的代码。 我现在面临的问题是,调用real并给出nullPointerException。 我的假设是与一起工作,以便指定要验证的静态方法。 我错过什么了吗?

    • Mockito似乎获得了越来越多的PowerMockito功能。 当我更新到 测试失败了。 所以我试图摆脱PowerMokito。 问题是没有验证静态https://www.javadoc.io/doc/org.powermock/powermock-api-mockito/latest/org/powermock/api/mockito/PowerMockito.html#verifyStati

    • 拥有一个内部生成错误消息的类,并使用android的静态函数util。日志i(String,String)来记录错误(可能是其他静态函数来记录故障)。 测试旨在验证是否记录了错误消息(使用mockito inline 3.8.0): 如何模仿android。util。登录并验证其静态android。util。日志已使用字符串调用i(String,String)? (powermock不是选项。它使

    • 问题内容: 我已经写了一家工厂来生产物体: 我想验证传递给的参数,但不知道如何模拟静态方法。我在测试用例中使用的是和。有没有模拟或验证此特定用例的好方法? 问题答案: 在Mockito上使用PowerMockito。 示例代码:

    • 我希望在从另一个类调用的方法“SetTotalSum”中使用findViewById。我如何使用它,尽管它是一个静态方法?