JUnit用于抽象类的最终方法

时间:2017-10-26 21:28:19

标签: java unit-testing junit mockito powermock

我在编写JUnit测试时遇到问题。问题是以下代码块中有一个最终方法Product

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,这是一个抽象类。

AbstractMessageSourcegetMessage()中的最终方法。

以下是我的Test类的精简版:

AbstractMessageSource

我使用PowerMockito,因为我了解到Mockito无法确定最终方法。

我得到的错误是

  

在代码' CONSTANT_STRING'下找不到任何消息对于语言环境' EN_US'。

看来我的@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); } } ... when实际上并未被用作thenReturn。我尝试将getMessage()添加到我创建模拟的行中,但这似乎不起作用。

有谁知道如何将其排除在外?我是否适合嘲笑CALLS_REAL_METHOD,而不是AbstractMessageSource?任何帮助将不胜感激!

更新:

我仍然在寻求帮助。我仍然遇到无法拦截ReloadableResourceBundleMessageSource实际被调用的问题......

1 个答案:

答案 0 :(得分:1)

试试这个

Mockito.when(
    amsMock.getMessage(
        eq(CONSTANT_STRING),
        eq(null),
        any(Locale.class))).thenReturn("test01");

编辑:这个策略很可怕, 因为您需要为单元测试期间访问的每个属性模拟getMessage方法。

您想要的是能够设置在单元测试期间使用的属性值。 如果是这种情况, 包括单元测试的属性配置。 对于春天, 您可以创建一个引用测试属性的单元测试配置,并使用SpringRunner加载它。