尝试方法引用类方法时"incompatible parameter types in method reference"



我正在尝试模拟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 上找到它。测试通过。模拟方法被简化为使用intlong,但机制保持不变。

相关内容

  • 没有找到相关文章

最新更新