Java 什么';注册一个类以在以后执行特定任务是一种很好的模式吗?

Java 什么';注册一个类以在以后执行特定任务是一种很好的模式吗?,java,unit-testing,playframework,testng,mockito,Java,Unit Testing,Playframework,Testng,Mockito,我正在编写一个测试套件,我正在考虑如何模拟某些请求/响应流。例如,我想测试一个进行多个RESTful调用的方法: getCounts() { ... Promise<Integer> count1 = getCount1(); Promise<Integer> count2 = getCount2(); // returns a DataModel containing all counts when the Promises redeem } get

我正在编写一个测试套件,我正在考虑如何模拟某些请求/响应流。例如,我想测试一个进行多个RESTful调用的方法:

getCounts() {
  ...
  Promise<Integer> count1 = getCount1();
  Promise<Integer> count2 = getCount2();

  // returns a DataModel containing all counts when the Promises redeem
}

getCount1() {
  ...
  Request<Foo> request = new Request<Foo>();
  sendRequest(request);
  ...
}

getCount2() {
  ...
  Request<Bar> request = new Request<Bar>();
  sendRequest(request);
  ...
}

sendRequest(Request<T> request) {...}
getCounts(){
...
Promise count1=getCount1();
Promise count2=getCount2();
//返回包含兑现承诺时的所有计数的数据模型
}
getCount1(){
...
请求=新请求();
发送请求(请求);
...
}
getCount2(){
...
请求=新请求();
发送请求(请求);
...
}
发送请求(请求请求){…}
但是,每个
getCount()
方法都会创建一个不同的
Request
对象,其中
描述了针对所检索计数的请求类型。这意味着我不能简单地“模拟”
sendRequest()
方法,因为每次都用不同的类型调用它

我在考虑一种方法,我注册一个“处理程序”。。。调用
sendRequest()
时,它确定要调用哪个处理程序,处理程序将知道要返回的模拟数据的适当类型。注册类似于存储处理程序类类型或处理程序类的实例以及它所需的模拟数据,当调用
sendRequest()
时,它将查找并调用正确的处理程序


然而,我不确定这是否是一个好的模式,我想知道是否有更好的方法来解决这个问题。注册类或特定方法以稍后执行特定任务的好模式是什么?

如果没有更多上下文,很难回答,但一般的方法是使用控制反转(IOC)。例如,将
getCountXXX
方法放入它们自己的类中,这对于更好地重用、可读性、封装、可测试性等可能是一个好主意:

public class CountFetcher {
  getCount1() { ... }
  getCount2() { ... }
}
原始代码现在使用任何可用的“注入”机制获取
CountFetcher
的实例。最简单的只是一个构造函数:

public class Counter {
  private final CountFetcher fetcher; 

  public Counter(CountFetcher fetcher) { 
    this.fetcher = fetcher;
  }

  public getCounts() {
    Promise<Integer> count1 = fetcher.getCount1();
    Promise<Integer> count2 = fetcher.getCount2();
    ...
  }
}

测试:这是
static
不是你朋友的#1原因。我对此束手无策<代码>静态是代码库的一部分,我只需要使用它
public class MockCountFetcher extends CountFetcher {
  @Override
  getCount1() { return mockCount1; }
}

public class TestCounter {
  @Test
  public void smokeTest() {
    CountFetcher mockFetcher = new MockCountFetcher();
    Counter counter = new Counter(mockFetcher);
    assertEquals(someExpectedValue, counter.getCounts());
  }
}