>我有一个公共方法说a()
,它调用一个私有方法说B()
存在于同一个类中。
现在我的方法B
(私有(调用外部方法(比如search()
(,它返回字符串列表。基于返回的列表;我必须在方法 B
中执行一些逻辑。
当我用一些列表值模拟外部方法调用(mock search
(时,mockito返回了空列表;而不是我在模拟这个外部调用时设置的列表。
我不明白为什么,我得到的是空列表。
下面是示例代码:
public class ABC {
@Autowired
private External ext;
// method 1
public void A(String id){
// method private call
B(id);
}
private String B(String id) {
// do something
// external method call
List myList = ext.search(id); // from here we getting empty list
if(myList != null &&
!myList.isEmpty()) {
// do some logic here,
}
}
}
Sample Test Class:
@RunWith(SpringJUnit4ClassRunner.class)
Class MyTest{
@Autowire
ABC abc;
@Test
public void myTest() {
// construct the mocked object
List resultList = new ArrayList();
resultList.add("Java");
resultList.add("C");
resultList.add("Python");
// mock the external API
Mockito.when(externalMock.search(Mockito.any(String.class)).
thenReturn(resultList);
// call method A on ABC class
abc.A(); // public method A call
}
}
模拟外部类
@Profile("test")
@Configuration
public class ExternalMock {
@Bean
@Primary
public External getExternal() {
return Mockito.mock(External.class);
}
}
因此,通常使用模拟框架,其想法是替换类的依赖项,在这种情况下External
使用简化的替换实现,以便您可以从测试中排除依赖项的行为。为此,您需要指定外部依赖项的接口,在您的情况下,可以通过创建一个IExternal
接口并将其注入构造函数。当您实例化类的实际版本时,您可以传入External
实现IExternal
,在测试用例中,您可以传入IExternal
类的模拟实例。
这是一篇文章,其中包含使用 Mockito 将模拟依赖项注入类的示例。
External
应该显式注入到主题类中。
public class ABC {
private External ext;
@Autowire
public ABC(External ext) {
this.ext = ext;
}
// method 1
public void A(String id){
// method private call
B(id);
}
private String B(String id) {
// do something
// external method call
List myList = ext.search(id);
if(myList != null &&
!myList.isEmpty()) {
// ... do some logic here,
}
}
}
这将允许在单独测试时替换模拟。
public class MyTest {
@Test
public void myTest() {
//Arrange
List resultList = new ArrayList();
resultList.add("Java");
resultList.add("C");
resultList.add("Python");
// mock the external API
External externalMock = Mockito.mock(External.class);
Mockito.when(externalMock.search(Mockito.anyString()).thenReturn(resultList);
ABC abc = new ABC(externalMock);
String input = "Hello world";
//Act
abc.A(input); // public method A call
//Assert
//...
}
}