我正在编写(junit)一个类的单元测试,该类使用以下方法实现公开的接口:
public Set<Setting> getUserSettings();
public Set<Setting> getOrganizationSettings();
public Set<Setting> getDefaults();
public Set<Setting> getAllSettings();
从特定图层获取设置的方法可以从各个位置执行IO以检索其结果。 getAllSettings()返回所有级别的所有设置的单个集合,其中“最高”级别具有首选项(即,如果默认和用户级别中存在设置,则将使用用户级别中的设置。
我已经为getUserSettings(),getOrganizationSettings(),getDefaults()编写了单元测试,用Mocked对象模拟了IO操作。
getAllSettings()的实现类似于
public Set<Setting> getAllSettings(){
Set<Setting> defaults = getUserSettings();
Set<Setting> custom = getOrganizationSettings();
Set<Setting> undefined = getDefaults();
//perform some sorting and business logic
//return fully sorted set
}
我的问题在于如何对getAllSettings()方法进行单元测试。我是否对用户/组织/默认设置方法使用的所有下游资源调用使用模拟(使用easymock / powermock)?似乎会有更清洁/更好/更简单的方法来实现它。
答案 0 :(得分:5)
您可以使用以下格式编写测试
@Test
public void testGetAllSettings() {
Foo fixture = new Foo() {
public Set<Setting> getUserSettings() { // canned impl }
public Set<Setting> getOrganizationSettings() { // canned impl }
public Set<Setting> getDefaults() { // canned impl }
}
Assert.assertEquals(whatEverItShouldEqual, fixture.getAllSettings());
}
这将允许您测试获取所有设置的逻辑,与其他方法无关。
另一种选择是模拟这些方法的IO。如果你有一个执行IO逻辑的层,那么可以嘲笑它。如你所说,如果你有很多依赖,这可能会很痛苦。也许表明你需要更少的依赖? (例如,该类应该分解成更小的单元?)