模拟静态方法时出现内容类型错误

Posted

技术标签:

【中文标题】模拟静态方法时出现内容类型错误【英文标题】:Content type error when mocking static method 【发布时间】:2019-03-24 13:22:12 【问题描述】:

我正在尝试测试控制器内的方法。 如果我注释掉在我正在测试的方法中调用的静态方法中的逻辑,则测试通过。

我无法评论该逻辑,而只是想模拟它。现在模拟工作, 但我得到一个新的错误如下:

java.lang.AssertionError:未设置内容类型

但我确实指明了内容类型。请告知我做错了什么。

@Test
public void testMethod() throws Exception

    // If I don't mock this, test will fail. 
    // If I don't mock this comment out logic in this method, test passes. 
    // If I mock this, test passes if I don't check for content type.
    // I am using Power Mockito. 

    mockStatic(MyStaticClass.class);
    doReturn("").when(MyStaticClass.class, "someMethod", any(Config.class), anyString());

    //also tried this, works. 
    //when(MyStaticClass.someMethod(any(Config.class), anyString())).thenReturn("");


    //as mentioned above this would work if I comment out logic in MyStaticClass. 
    mockMvc.perform(
                get("/api/some/a/b/c/d").accept(
                        MediaType.APPLICATION_JSON))
                .andExpect(status().isForbidden())
                .andExpect(content().contentType("text/html")); // when I mock, I need to comment this out to get test to work.  




// Controller 

@RequestMapping(value = "/a/b/c", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) // I do have content type
@ResponseBody
public MyResponse getSomething(
            HttpServletRequest request, HttpServletResponse response,
            @PathVariable String a, @PathVariable String b,
            @PathVariable String c,
            @RequestParam(value = "some", required = false) String some)
            throws Exception 

            // some logic 

            //static method being called
            MyStaticClass.someMethod("sample", "sample2");

            try 
                MyResponse myPageResponse = new MyResponse(anotherStr, someStr); // it breaks here and throws that error msg. Doesn't reach return.
                return MyResponse;
             catch (NullPointerException npe) 

【问题讨论】:

【参考方案1】:

这是一个获取请求,它没有正文,因此理想情况下使用 contentType("text/html") 指定内容类型标头可能不是正确的方法。 其次 您在请求中的 content-type 标头必须与 @consumes 值匹配,它清楚地表明您希望发送 text/html 但没有 @consumes 支持。

【讨论】:

嗨,你的意思是理想情况下我不应该这样做吗? -> .andExpect(content().contentType("text/html")); ? 理想情况下 Get 请求没有正文,因此 contentType 没有意义,但即使您想实现它,您也必须使用 @consumes 添加相同的代码(类似于你已经在代码中使用过produce)。 请您通过***.com/questions/5661596/… 如果您觉得这很有用,请点赞并接受答案:) 感谢您的回答。有道理。

以上是关于模拟静态方法时出现内容类型错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIWebView 加载静态资源时出现随机错误

访问方法时出现 IllegalAccess 错误

为啥在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?

通过检测字节码调用类的静态方法时出现 NoClassDefFoundError

模拟调用“upvote”的效果时出现异常。类型错误:未定义不是函数

尝试在 Java 中使用静态变量时出现标识符异常