在私有方法中调用方法调用时模拟该方法调用



>我有一个公共方法说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
        //...
    }
}

相关内容

  • 没有找到相关文章

最新更新