2017-07-26 9 views
0

getBeansOfType(クラス<T>タイプ)

ctx = org.springframework.context.ApplicationContext 
clazz = Class<T> 

が、私はモックする必要が

Map<String, T> beansMap = ctx.getBeansOfType(clazz); 

ctx.getBeansOfType(clazz)この返信はMap<Spring, T>できません。

+0

モックことができる方法ですか?テストしようとしているクラスの詳細を表示できますか? – Plog

答えて

1

通常、カップリングを導入するので、ApplicationContextから豆を直接取得することは悪い習慣と考えられています。 この理由を参照してくださいhttps://stackoverflow.com/a/9663099/6604329

フィールド、コンストラクタ、またはルックアップメソッドの注入を使用すると、ApplicationContextのモックが不要になります。

任意の方法は、ここであなたはどのようにあなたは、CTXをinstatiatingているApplicationContext.getBeansOfType(clazz)

import org.junit.Test; 
import org.mockito.Mockito; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 
import org.springframework.context.ApplicationContext; 

import java.util.HashMap; 
import java.util.Map; 

import static org.junit.Assert.assertFalse; 
import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

/** 
* @author mponomarev 
*/ 
public class ApiTest { 
    @Test 
    public void testSomething() throws Exception { 
     ApplicationContext applicationContext = mock(ApplicationContext.class); 
     final Map beans = new HashMap(); 

     when(applicationContext.getBeansOfType(any(Class.class))) 
      .thenAnswer(new Answer<Map<String,Object>>() { 
       @Override 
       public Map<String,Object> answer(InvocationOnMock invocation) 
       throws Throwable { 
        Class clazz = invocation.getArgumentAt(0, Class.class); 
        beans.put("beanName", mock(clazz)); 
        return beans; 
       } 
      }); 

     Api api = new Api(applicationContext); 
     api.perform(); 

     assertFalse("beans shouldn't be empty", beans.isEmpty()); 
     for(Object o : beans.values()) { 
      Component component = (Component)o; 
      Mockito.verify(component).doSomething(); 
     } 
    } 

    public static class Api { 
     private final Map<String,Component> components; 

     Api(ApplicationContext applicationContext) { 
      this.components = applicationContext.getBeansOfType(Component.class); 
     } 

     void perform() { 
      for(Component component : components.values()) { 
       component.doSomething(); 
      } 
     } 
    } 

    public interface Component { 
     void doSomething(); 
    } 
} 
+0

初心者のための素敵な答え! – GhostCat

関連する問題