我有一个Java类,它只是扩展了一个库类,并使用默认参数调用其父类的方法。我该如何编写Junit测试? MockObjectTestCase也很好。以下是我所说的一个例子:
public class ResourceBundleMessageSource {
public String getMessage(String key, Object[] objects, Locale locale) {
//Spring library method
}
}
public class MessageResource extends ResourceBundleMessageSource {
public String getMessage(String key) {
return (getMessage(key, null, Locale.getDefault());
}
}
我知道包装器方法甚至不是必需的,但可以更频繁地调用它。请注意,该类工作正常,我只对如何编写单元测试感兴趣。
答案 0 :(得分:3)
如果您愿意稍微重构一下您的课程,我建议将MessageResource
委托给MessageSource
个实例,而不是扩展ResourceBundleMessageSource
。然后我会在我的单元测试中使用模拟。像这样:
public class MessageResource implements MessageSource {
private final MessageSource delegate;
public MessageResource(MessageSource delegate) {
this.delegate = delegate;
}
public String getMessage(String key) {
return delegate.getMessage(key, null, Locale.getDefault());
}
// need to implement three other MessageSource methods,
// simple pass-throughs to delegate
}
和单元测试
public class MessageResourceTest {
private MessageSource mockDelegate;
private MessageResource messageResource;
@Before
public void setUp() throws Exception {
mockDelegate = //mock with your favorite framework, or by hand
messageResource = new MessageResource(mockDelegate);
}
@Test
public void testGetMessage() {
String key = "foo";
String actualMessage = messageResource.getMessage(key);
assertEquals(key, /* get key passed to mock delegate */ );
assertSame(Locale.getDefault(), /* get Locale passed to mock delegate */);
assertEquals(/*expected message from mock*/, actualMessage);
}
}
答案 1 :(得分:2)
对于这个特殊的例子,我的probalby不会费心去测试它。
如果您确实需要测试它,请尝试以下方法:
@Test
public void getDefaultMessage() {
ResourceBundleMessageSource origSource = <create source>
MessageResource subSource = <create with same criteria as origSource>
String key = <some key that is locale-specific>
assertEquals(origSource.getMessage(key, null, Locale.getDefault()),
subSource.getMessage(key));
}
如果前两行很难写,那么不测试就更有意义了。 如果您有这样的多个测试,请将前两行移动到设置夹具中。
答案 2 :(得分:0)
我认为甚至不值得为此编写单元测试。如果已经对ResourceBundleMessageSource.getMessage()进行了测试,那么这应该足够了。