我正试图为类foo
的特定方法编写单元测试。这个类扩展了另一个类——bar
,它位于一个外部jar中。
问题是,这个基础bar
有一些方法与数据库交互,我不想实际调用。
我尝试创建这个基类foo的模拟,但这不起作用。它实际上尝试连接到数据库,而不是模拟。
@Test
public void testSomeMethod(){
bar b= mock(bar.class);
when(b.calldatabase()).thenReturn(resultset); //calldatabse is in base class bar
//create expected object, and set properties here
Results expected = new Results();
expectedResult = foo.MethodUnderTest(); // this has call to calldatabase and then uses resultset mocked above
assert()...
}
我正在使用JUnit4与Mockito。
真的有可能像这样——在基类中模拟方法,但实际上测试派生类吗?如果没有,我该如何测试?
如果需要,我可以更改基类,并根据需要使用任何其他工具/库。
您模拟了Bar的一个实例,但是这个模拟的Bar从未在您的测试中使用过,因为您测试的是一个单独的实例:foo。创建模拟Bar实例会创建一个动态生成的新类的对象,该对象覆盖Bar类的所有方法。它不会改变Bar类中方法的内部字节码。
您需要的是一个Spy,或者部分mock:
Foo partiallyMockedFoo = spy(new Foo());
// stub the doSomethingWithTheDatabase()
when(partiallyMockedFoo.doSomethingWithTheDatabase()).thenReturn("1234");
// call the real method, that internally calls doSomethingWithTheDatabase()
partiallyMockedFoo.methodUnderTest();