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");
}
答案:归功于: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");
}