Просто, чтобы сделать @ предложение Робина шаблона стратегии более конкретно: (Обратите внимание на то, что общественность API вашего первоначального вопроса остается неизменным.)
public class MyLegacyClass {
private static Strategy strategy = new JNDIStrategy();
public static SomeLegacyClass doSomeLegacyStuff(SomeOtherLegacyClass legacyObj) {
// legacy logic
SomeLegacyClass result = strategy.doSomeStuff(legacyObj);
// more legacy logic
return result;
}
static void setStrategy(Strategy strategy){
MyLegacyClass.strategy = strategy;
}
}
interface Strategy{
public SomeLegacyClass doSomeStuff(SomeOtherLegacyClass legacyObj);
}
class JNDIStrategy implements Strategy {
private static final String jndiName = "java:comp/env/jdbc/LegacyDataSource";
public SomeLegacyClass doSomeStuff(SomeOtherLegacyClass legacyObj) {
// do stuff using jndiName
}
}
... и тест JUnit. Я не большой поклонник того, чтобы делать это обслуживание установки/слежения, но это неудачный побочный эффект от использования API на основе статических методов (или Singletons, если на то пошло). Что я делаю do Как и в этом тесте, он не использует JNDI - это хорошо, потому что (а) он будет работать быстро, и (b) единичный тест должен только тестировать бизнес-логику в методе doSomeLegacyStuff() в любом случае, а не тестирование фактического источника данных. (Кстати, это предполагает, что тестовый класс находится в той же упаковке, что и MyLegacyClass.)
public class MyLegacyClassTest extends TestCase {
private MockStrategy mockStrategy = new MockStrategy();
protected void setUp() throws Exception {
MyLegacyClass.setStrategy(mockStrategy);
}
protected void tearDown() throws Exception {
// TODO, reset original strategy on MyLegacyClass...
}
public void testDoSomeLegacyStuff() {
MyLegacyClass.doSomeLegacyStuff(..);
assertTrue(..);
}
static class MockStrategy implements Strategy{
public SomeLegacyClass doSomeStuff(SomeOtherLegacyClass legacyObj) {
// mock behavior however you want, record state however
// you'd like for test asserts. Good frameworks like Mockito exist
// to help create mocks
}
}
}
Я обновил свой ответ на основе вашего нового ограничения. На самом деле у нас есть система, которая должна была решить ту же проблему. – Robin 2008-10-30 13:41:23