我正在尝试模拟TemplateRendererUtil
类的静态方法render
以在测试时返回null
。不确定这是否是正确的方法,我尝试测试的方法调用此类,但我只是希望它基本上跳过这个。
在此处收到编译错误:
try (MockedStatic<TemplateRendererUtil> mockedStatic = Mockito.mockStatic(TemplateRendererUtil.class)){
// java: incompatible types: incompatible parameter types in method reference
mockedStatic.when(TemplateRendererUtil::render).thenReturn(null);
}
被引用的类:
public class TemplateRendererUtil {
private static final ResponseTemplateRenderer RENDERER = ResponseTemplateRenderer.getInstance();
private TemplateRendererUtil() {
}
public static void render(HttpServletRequest req, HttpServletResponse resp, String templateFile, Map<String, Object> params) throws TemplateRendererUtilException {
try {
RENDERER.render(req, resp, templateFile, params);
} catch (ResponseTemplateRendererException var5) {
throw new TemplateRendererUtilException(var5);
}
}
}
堆栈跟踪 atMockito.mockStatic
:
java.lang.InternalError: class redefinition failed: invalid class
at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167)
at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:280)
at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.mockClassStatic(InlineBytecodeGenerator.java:225)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClassStatic(TypeCachingBytecodeGenerator.java:63)
at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.createStaticMock(InlineDelegateByteBuddyMockMaker.java:560)
at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createStaticMock(InlineByteBuddyMockMaker.java:83)
at org.mockito.internal.util.MockUtil.createStaticMock(MockUtil.java:147)
at org.mockito.internal.MockitoCore.mockStatic(MockitoCore.java:142)
at org.mockito.Mockito.mockStatic(Mockito.java:2181)
at org.mockito.Mockito.mockStatic(Mockito.java:2118)
...
如我所见,渲染方法没有返回任何内容,因此您可以这样做
try (MockedStatic<TemplateRendererUtil> mockedStatic = Mockito.mockStatic(TemplateRendererUtil.class)){
doNothing().when(TemplateRendererUtil.render(Mockito.any(), Mockito.any(), Mockito.anyString(), Mockito.anyMap()));
}
你的代码实际上有两个问题。
首先是你没有为方法TemplateRendererUtil.render()
提供代码(没有参数),并且你使用这种方法的引用作为传递给when()
的参数。您没有使用测试代码中显示的 4 个参数引用该方法。
第二个问题是,您尝试从不返回任何内容(void
类型)的方法返回null
。
正确的代码是:
try (MockedStatic<TemplateRendererUtil> mockedStatic = Mockito.mockStatic(TemplateRendererUtil.class)) {
mockedStatic.when(() -> TemplateRendererUtil.render(any(), any(), anyString(), anyMap()))
.thenAnswer(inv -> null);
// rest of the test
}
如果需要,您可以使用更合适的匹配器,而不是any...
匹配器。
我已经重现了问题并测试了解决方案 - 您可以在 GitHub 上找到它。测试通过。模拟方法被简化为使用int
和long
,但机制保持不变。