【问题标题】:JUnit for final method of abstract classJUnit 用于抽象类的最终方法
【发布时间】: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


【解决方案1】:

试试这个

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

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

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

【讨论】:

  • 仍然收到此错误:“org.springframework.context.NoSuchMessageException: No message found under code 'validation.js.register.phoneNumber' for locale 'en_US'. at org.springframework.context.support .AbstractMessageSource.getMessage(AbstractMessageSource.java:159)"
  • 因此,您的意思似乎不是“仍在获得”,而是“有效,但现在我获得了”。是这样吗?
  • 对不起。实施您的建议后,我仍然遇到与以前相同的错误。
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 2012-09-21
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多