模拟/存根与Java中的集成测试

模拟/存根与Java中的集成测试,java,mocking,integration-testing,stubbing,rest-assured,Java,Mocking,Integration Testing,Stubbing,Rest Assured,我在端点上使用rest-assured进行集成测试。其中一个端点依赖于另一个资源(它有条件地调用另一个API)。有没有一种方法可以让我删除API调用,这样我就可以为这种情况编写测试?假设您的代码通过http在内部调用endpointB,您可以使用or来存根该API。因此,当您的代码在内部调用另一个API时,它将命中这些存根,这将始终返回一个虚拟响应。希望这有帮助 interface IDataProvider { string RetrieveData(); } class Standard

我在端点上使用rest-assured进行集成测试。其中一个端点依赖于另一个资源(它有条件地调用另一个API)。有没有一种方法可以让我删除API调用,这样我就可以为这种情况编写测试?

假设您的代码通过http在内部调用endpointB,您可以使用or来存根该API。因此,当您的代码在内部调用另一个API时,它将命中这些存根,这将始终返回一个虚拟响应。希望这有帮助

interface IDataProvider {
 string RetrieveData();
}

class StandardDataProvider : IDataProvider {
 public string RetrieveData(){
  // call to API
 }
}

class Program {
 private IDataProvider _dataProvider;

 public Program(IDataProvider provider = null) {
  _dataProvider = provider ?? new StandardProvider();
 }

 public void MethodToTest(){
  var data = _dataProvider.RetrieveData();
  // do your thing
 }
}
在测试中,您可以通过创建自己的
IDataProvider
对象并处理其数据来模拟数据

class TestDataProvider : IDataProvider {
 public string RetrieveData(){
  return "my own data";
 }
}

class Test {
 [TestMethod]
 public void TestProgram(){
  var obj = new Program(new TestDataProvider);
  var result = obj.MethodToTest();
  // asserts
 }
}

如果您将数据的检索与数据的操作分开,并将其外包给具有实现的接口,您可以使用构造函数或setter注入来注入您自己的测试数据。@Jeroenvanevel您能提供一个示例吗?我已经发布了一个示例作为答案。它们都需要在运行JUnit测试时运行另一个进程,对吗?是的,您必须在运行rest测试用例之前启动它们。因为rest没有mock或stub(据我所知),所以我们必须这样做。