当前位置: 首页 > 知识库问答 >
问题:

JUnit用于抽象类的最终方法

谭成业
2023-03-14

我写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中的最后一个方法。

这是我的Test类的浓缩版本:

@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”下找不到消息。

看起来我的...thenBack实际上并没有被用作getMessage()正在被调用。我尝试将CALLS_REAL_METHOD添加到我创建Mock的行中,但这似乎不起作用。

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

更新:

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

共有1个答案

唐啸
2023-03-14

试试这个

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

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

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

 类似资料:
  • 问题内容: 我有一个很简单的问题: 我想要一个Java类,该类提供一个公共静态方法,该方法可以执行某些操作。这只是出于封装目的(将所有重要的内容都放在一个单独的类中)… 此类不应被实例化或扩展。那让我写道: (尽管我知道,这是禁止的)。 我也知道,我可以使此类完全为final,并在将其私有化时覆盖标准构造函数。 但这在我看来更像是一种“解决方法”,应该更可能由最终的抽象类完成… 而且我讨厌解决方法

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • 问题内容: 我想知道下面的代码是否有意义,因为编译器会警告“空白的最终字段对象可能尚未初始化”。有更好的方法吗? 问题答案: 我将字段定为final,并强制构造函数将值向上传递:

  • 嗨,我有一个抽象类,其中有一些公共方法和一些抽象方法。我让公众知道,他们实现了派生类的通用方法。 让我困惑的是,为什么我想定义一个公共抽象方法,而不是受保护的抽象方法。在抽象类中定义公共抽象方法对我来说毫无意义。。。。因为if是一个抽象,在派生类中会被重写,但if被定义为public也是一样的,但在某种程度上,将其定义为protected更有意义,因为我们知道,我们将在派生类中重写它。 在抽象类中