Mockito:我们是否可以使用 Mockito 模拟在测试类中使用 new 关键字调用的对象


@Component
Class A{
   public String method1(){
       ClassB bObject = new ClassB();
       bObject.makeHTTPCallAndConvertResponseToJSONString();
   }
}
Class ATest{
    @InjectMocks
    ClassA aObject;
    public String testMethod1(){
        // how to test aObject.method1();
        // I want to mock new bObject that is created
    }
}

需要模拟正在创建的 bObject。想知道这是否可能。浏览了同一主题的所有相关问题,但找不到任何问题。这是莫吉托的限制吗?

您不能模拟方法的本地对象。您只能模拟类级别对象。看看你分享的代码段,我建议没有必要对方法method1进行单元测试(因为它只是调用其他方法,这里不涉及条件或循环(。最好对 ClassB 的"makeHTTPCallAndConvertResponseToJSONString"方法进行单元测试

我不认为你可以模拟使用"new"创建的对象 关键字。但是,您可以创建一个公共 getter 方法来创建该对象,然后模拟新方法。

这是一个通用代码供您理解 -

//your method
public void someMethod() {
   ...
   Object object = new Object();
   ...
}

从另一个公共方法获取新对象。

//new implementation
public void someMethod() {
   ...
   Object object = getObject();
   ...
}
public Object getObject() {
   return new getObject();
}

现在,您可以模拟 getObject 方法并从此方法返回模拟对象。

您需要将bObject本地对象转换为类级对象

然后你可以像下面这样模拟它:

@RunWith(MockitoJUnitRunner.class)
public class ATest {
  @Mock
  private ClassB  bObject;
  private ClassA aObject;
  @Before
  public void setUp() throws IOException {
      aObject = new ClassA(bObject);
  }
  @Test
  public String testMethod1(){
      String mockedJsonString = "{'sample':'string'}";
      when(bObject. makeHTTPCallAndConvertResponseToJSONString()).thenReturn(mockedJsonString);
      // Do whatever you want to test and verify
  }
}

最新更新