Attila 适用于大多数情况。您要测试的是 create 实际上做了您认为它应该做的事情,而不是它是如何做的。您在这里的情况听起来像,“我已经知道 baseCreate 做了我想要它做的事情,所以我不想重新测试它,只是它被调用了。” 可能是这种情况,但如果是这样,那么您的超类实际上更像是一个合作者。这是支持委托而不是继承的部分原因。尽管如此,有时很难回过头来改变那个设计决定,所以你必须测试你所拥有的。
您仍然应该倾向于仅检查“create”是否总体上执行了您希望它执行的操作,但是您可能会遇到这样的情况,baseCreate 确实在做很多需要设置大量协作者的事情,这使得它难以测试且易碎。在这种情况下,您会想要使用“间谍”。除非您专门创建另一个期望,否则间谍会包装“真实”对象并委托给真实的方法调用。
如果你可以公开 baseCreate,你可以像这样使用 Mockito:
@RunWith(MockitoJUnitRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
public class YourTestCase {
@Spy
private Derived classUnderTest = new Derived();
@Test
public void privatePartialMockingWithPowerMock() {
MyObject myObject = new MyObject();
when(classUnderTest.baseCreate(myObject)).thenReturn(myObject);
// execute your test
classUnderTest.create(myObject);
verify(classUnderTest).baseCreate(myObject);
}
}
如果您不能公开 baseCreate,我认为您可以使用PowerMock。它可以让您验证私有方法,但我认为它也没有任何理由不能执行受保护的方法。
@RunWith(PowerMockRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
@PrepareForTest(Derived.class)
public class YourTestCase {
@Test
public void testCreate() {
Derived classUnderTest = PowerMockito.spy(new Derived());
MyObject myObject = new MyObject();
// use PowerMockito to set up your expectation
PowerMockito.doReturn(myObject).when(classUnderTest, "baseCreate", myObject);
// execute your test
classUnderTest.create(myObject);
// Use PowerMockito.verify() to verify result
PowerMockito.verifyPrivate(classUnderTest).invoke("baseCreate", myObject);
}
}