我写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()
实际被调用的问题...
试试这个
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更有意义,因为我们知道,我们将在派生类中重写它。 在抽象类中