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

时间:2018-01-24 06:46:05

标签: java spring mockito

@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。想知道这是否可行。查看了同一主题的所有相关问题,但找不到任何相关问题。这是Mockito的限制吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为你不能模拟使用'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方法并从这个方法返回你的模拟对象。

答案 2 :(得分:0)

您需要从本地对象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
  }
}