2009-06-17 110 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); 
    } 

}