繁体   English   中英

抽象类的最终方法的 JUnit

[英]JUnit for final method of abstract class

我在编写 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()实际被调用的问题......

尝试这个

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM