如何对调用给定方法的任何对象抑制/不执行任何操作?

问题描述 投票:0回答:1
Class ClassA
{

  DatabaseObject dba

  public classA(DatabaseObject db) { dba = db}

  Method methodA(String stringA)
  {

    DatabaseEntityA objectA = new DatabaseEntityA();

    objectA.save(stringA);

  }
}
class testClass
{

  @InjectMocks
  DatabaseObject mockDB = mock(DatabaseObject.class);


  void testMethod()
  {

    ClassA classA = new ClassA(mockDB);

    //How to mock objectA.save to do nothing!
    //PowerMockito.suppress(PowerMockito.method(DatabaseEntityA.class "save")); ?? this doesn't work
    //doNothing.when(ArgumentMatchers.any(DatabaseEntityA.class)).save() // does not work, throws a exception
    classA.methodA("mock data");
  }
}

我不知道如何在不更改对该对象的访问权限的情况下创建 objectA 的模拟对象,我不想这样做。那么我怎样才能做到这一点,以便mockito只抑制对DatabaseEntityA类型的任何对象的save方法的任何调用?

编辑:答案:归功于:knittl

这基本上是做不到的。阅读给出的答案链接。

不可能模拟通过 new 调用在方法中创建的对象。如果您有一个使用 new 创建的对象并且需要模拟它,则需要重构该对象,以便它不是通过 new 调用创建的。 如果它是通过其他方式创建的,您需要模拟该对象的创建方式,然后将其分配给该对象。

即。

DatabaseEntityA objectA = new DatabaseEntityA(); //can not be mocked

将其更改为这样的内容:

//in the class
DatabaseEntityA objectA = getNewObjectA();
//the test
void testMethod()
{
  ClassA classA = new ClassA(mockDB);
  DatabaseEntityA mockedEntityA = mock(DatabaseEntityA.class);
  
  doReturn(mockedEntityA).when(classA).getNewObjectA();  
  doNothing().when(mockedObjectA).save();
  //Or if you save is not a void
  //doReturn(null).when(mockedObjectA).save();

  classA.methodA("mock data");

}
java unit-testing mockito powermock powermockito
1个回答
0
投票

答案:归功于:knittl

这基本上是做不到的。阅读给出的答案链接。

总长:

不可能模拟通过 new 调用在方法中创建的对象。如果您有一个使用 new 创建的对象并且需要模拟它,则需要重构该对象,以便它不是通过 new 调用创建的。如果它是通过其他方式创建的,您需要模拟该对象的创建方式,然后将其分配给该对象。

即。

DatabaseEntityA objectA = new DatabaseEntityA(); //can not be mocked

将其更改为这样的内容:

//in the class
DatabaseEntityA objectA = getNewObjectA();
//the test
void testMethod()
{
  ClassA classA = new ClassA(mockDB);
  DatabaseEntityA mockedEntityA = mock(DatabaseEntityA.class);
  
  doReturn(mockedEntityA).when(classA).getNewObjectA();  
  doNothing().when(mockedObjectA).save();
  //Or if you save is not a void
  //doReturn(null).when(mockedObjectA).save();

  classA.methodA("mock data");

}
© www.soinside.com 2019 - 2024. All rights reserved.