Java JUnit用于抽象类的最终方法

Java JUnit用于抽象类的最终方法,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,我在编写JUnit测试时遇到问题。问题是在下面的代码块中有最后一个方法getMessage(): if(these_conditions_are_true) { String message = messageResources.getMessage(CONSTANT_STRING, null, LocaleContextHolder.getLocale()); modelView.getModelMap().addAttribute(INLINE_MSG, message);

我在编写JUnit测试时遇到问题。问题是在下面的代码块中有最后一个方法
getMessage()

if(these_conditions_are_true) {
    String message = messageResources.getMessage(CONSTANT_STRING, null, LocaleContextHolder.getLocale());
    modelView.getModelMap().addAttribute(INLINE_MSG, message);
    return modelView;
}
MessageResources
是一个
可重新加载的ResourceBundleMessageSource
,它扩展了
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”下未找到消息

当调用
getMessage()
时,我的
似乎没有被实际使用。我尝试在创建模拟的行中添加
调用\u REAL\u方法
,但这似乎不起作用

有人知道怎么把它删掉吗?我模仿
AbstractMessageSource
,而不是
ReloadableResourceBundleMessageSource
,对吗?任何帮助都将不胜感激

更新:

我仍在寻求帮助。我仍然遇到无法截获
getMessage()
实际被调用的问题…

试试这个

Mockito.when(
    amsMock.getMessage(
        eq(CONSTANT_STRING),
        eq(null),
        any(Locale.class))).thenReturn("test01");
编辑:这个策略很糟糕, 因为您需要为单元测试期间访问的每个属性模拟
getMessage
方法

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

使用MessageSource作为classA的类型。程序到接口,而不是实现。这是Spring Boot应用程序还是至少是SpringWebMVC应用程序?我建议不要这样做。如果您花费更多时间尝试使用一些非常极端的测试代码来测试实现。肯定还有其他方法可以测试这一点。仍然会收到此错误:“org.springframework.context.NoSuchMessageException:在区域设置“en_US”的代码“validation.js.register.phoneNumber”下找不到任何消息。在org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:159)”处,而不是“仍然收到”,你的意思似乎是“那起作用了,但现在我得到了”。是这样吗?对不起。在实现了您的建议之后,我仍然会遇到与以前相同的错误。