2009-06-17 102 views
2

我有一个Java类,它简单地扩展了库类,并使用默认参数调用其父类的方法。我如何为此编写Junit测试? MockObjectTestCase也不错。这里是我正在谈论的一个例子:包装类的Junit测试用例

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()); 
    } 
} 

我知道包装方法甚至没有必要,但频繁调用它更容易。请注意,该课程正常工作,我只对如何编写单元测试感兴趣。

回答

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)); 
} 

如果前两行是很难写,那么它就更有道理了不对它进行测试。 如果您有多个这样的测试,请将前两行移动到安装夹具中。

0

我认为它甚至不值得为此编写单元测试。如果已经对ResourceBundleMessageSource.getMessage()进行了测试,那应该足够好。

3

如果您愿意稍微重构您的班级,我会推荐MessageResource代表MessageSource实例,而不是延长ResourceBundleMessageSource。然后我会在我的单元测试中使用mocks。事情是这样的:

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); 
    } 

}