我正在编写单元测试,以查找靠近我所在位置的银行的方法。 我嘲笑了这个类并试图调用这些方法。 但是,控制不是执行它的方法。 以下是单元测试用例。
@Test
public void testFindBanksByGeo() {
String spatialLocation = "45.36134,14.84400";
String Address = "Test Address";
String spatialLocation2 = "18.04706,38.78501";
// 'SearchClass' is class where 'target' method resides
SearchClass searchClass = Mockito.mock(SearchClass.class);
BankEntity bank = Mockito.mock(BankEntity.class);
// 'findAddressFromGeoLocation' and 'getGeo_location' to be mocked. They are called within 'target' method
when(searchClass.findAddressFromGeoLocation(anyString())).thenReturn(Address);
when(bank.getGeo_location()).thenReturn(spatialLocation2);
// 'writeResultInJson' is void method. so needed to 'spy' 'SearchClass'
SearchClass spy = Mockito.spy(SearchClass.class);
Mockito.doNothing().when(spy).writeResultInJson(anyObject(), anyString());
//This is test target method called. **Issue is control is not going into this method**
SearchedBanksEntity searchBanksEntity = searchClass.findNearbyBanksByGeoLocation(spatialLocation, 500);
assertNull(searchBankEntity);
}
我所尝试的也是在上面调用真正的方法,
Mockito.when(searchClass.findNearbyBanksByGeoLocation(anyString(), anyDouble())).thenCallRealMethod();
这调用了真正的方法,但我上面嘲笑的方法正在执行真实方法。手段&模拟方法'并没有回复我要求他们返回的东西。
那么,我在这里做错了什么? 为什么方法没有执行?
答案 0 :(得分:0)
该方法未被调用,因为您在模拟上调用它。您应该在实际对象上调用该方法。
或者你可以在调用方法之前使用类似的东西。
Mockito.when(searchClass.findNearbyBanksByGeoLocation(Mockito.eq(spatialLocation), Mockito.eq(500))).thenCallRealMethod();
但我认为这不是您应该编写测试的方式。你不应该首先嘲笑SearchClass。相反,SearchClass中会有一个依赖项,它会为您提供地址和地理位置。你应该嘲笑那种特殊的依赖。
答案 1 :(得分:0)
好的,我们说我们有这个代码:
class Foo {
// has a setter
SomeThing someThing;
int bar(int a) {
return someThing.compute(a + 3);
}
}
我们要测试Foo#bar()
,但是依赖于SomeThing
,我们可以使用模拟:
@RunWith(MockitoJunitRunner.class)
class FooTest {
@Mock // Same as "someThing = Mockito.mock(SomeThing.class)"
private SomeThing someThing,
private final Foo foo;
@Before
public void setup() throws Exception {
foo = new Foo(); // our instance of Foo we will be testing
foo.setSomeThing(someThing); // we "inject" our mocked SomeThing
}
@Test
public void testFoo() throws Exception {
when(someThing.compute(anyInt()).thenReturn(2); // we define some behavior
assertEquals(2, foo.bar(5)); // test assertion
verify(someThing).compute(7); // verify behavior.
}
}
使用模拟,我们可以避免使用真实的SomeThing
。
一些阅读: