包装类的Junit测试用例

时间:2009-06-17 19:12:51

标签: java junit spring

我有一个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());
   }
}

我知道包装器方法甚至不是必需的,但可以更频繁地调用它。请注意,该类工作正常,我只对如何编写单元测试感兴趣。

3 个答案:

答案 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()进行了测试,那么这应该足够了。