【发布时间】:2017-10-26 21:28:19
【问题描述】:
我在编写 JUnit 测试时遇到问题。问题在于以下代码块中有一个最终方法getMessage():
if(these_conditions_are_true) {
String message = messageResources.getMessage(CONSTANT_STRING, null, LocaleContextHolder.getLocale());
modelView.getModelMap().addAttribute(INLINE_MSG, message);
return modelView;
}
messsageResources 是一个ReloadableResourceBundleMessageSource,它扩展了AbstractMessageSource,这是一个抽象类。
getMessage() 是AbstractMessageSource 中的最终方法。
这是我的测试类的精简版:
@RunWith(PowerMockRunner.class)
@PrepareForTest({AbstractMessageSource.class, ClassBeingTested.class})
public class ClassBeingTestedTest {
@InjectMocks
ClassBeingTested classBeingTested;
@Mock
ReloadableResourceBundleMessageSource messageResources; //being used by a different test in this class, including in case it matters
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
// Build the mock
this.mockMvc = MockMvcBuilders.standaloneSetup(classBeingTested).build();
}
@Test
public void Method_Being_Tested_Test() {
AbstractMessageSource amsMock = PowerMockito.mock(AbstractMessageSource.class);
Mockito.when(amsMock.getMessage(any(), any(), any())).thenReturn("test01");
ModelAndView mv = classBeingTested.methodBeingTested(itemVO);
ModelAndView mv_Expected = createExpectedMV(); //not really how i'm doing it, but for the sake of simplicity i'll omit it
assertEquals(mv_Expected, mv);
}
}
我正在使用 PowerMockito,因为我了解到 Mockito 不能存根 final 方法。
我得到的错误是
在区域设置“EN_US”的代码“CONSTANT_STRING”下未找到消息。
看来我的when...thenReturn 实际上并没有被使用,因为getMessage() 正在被调用。我尝试将 CALLS_REAL_METHOD 添加到我创建 Mock 的行中,但这似乎不起作用。
有谁知道如何解决这个问题?我是否有权嘲笑AbstractMessageSource,而不是ReloadableResourceBundleMessageSource?任何帮助将不胜感激!
更新:
我仍在寻求帮助。我仍然遇到无法拦截 getMessage() 实际被调用的问题...
【问题讨论】:
-
使用 MessageSource 作为 classA 的类型。编程接口,而不是实现。
-
这是一个 Spring Boot 应用程序还是至少是一个 SpringWebMVC 应用程序?我建议不要这样做。如果您花费更多时间尝试使用一些非常极端的测试代码来测试实现。肯定有其他方法可以对此进行测试。
标签: java unit-testing junit mockito powermock